[LOJ#530]「LibreOJ β Round #5」最小倍数
[LOJ#530]「LibreOJ β Round #5」最小倍数
试题描述
第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话:
您的文件存在被盗风险,为安全起见,您需要通过「智商·身份验证 ver. 5.0 β 版」的验证,以证明您是资料的主人。请写一个程序解决下述问题:
给定 \(p\),求最小的正整数 \(n\),使得 \(n! mod p = 0\)。
由于 \(p\) 很大,输入将给出 \(m\) 和 \(e_1, e_2, \cdots, e_m\),表示 \(p = \prod_{i = 1}^{m}{\mathrm{pr}_i^{e_i}}\),其中 \(\mathrm{pr}_i\) 是从小到大第 \(i\) 个质数。
一共有 \(T\) 个同样形式的问题需要解决。
输入
第一行包含一个正整数 \(T\) 表示数据组数。
每组数据第一行一个正整数 \(m\) 。
第二行包含 \(m\) 个非负整数,其中第 \(i\) 个数字表示 \(e_i(i = 1, 2, \cdots, m)\),相邻两个数字之间恰好有一个空格。
输出
输出共 \(T\) 行,每行包含一个数字,表示该组数据的答案。
输入示例1
1
5
1 1 1 1 1
输出示例1
11
输入示例2
1
12
1 3 4 6 7 9 10 12 13 15 16 18
输出示例2
666
数据规模及约定
设 \(a_i = \mathrm{pr}_i \cdot e_i(i = 1, 2, \cdots, m)\)。
对于所有数据,\(1\leq T \leq 10^4, 1 \leq m \leq 100, 0 \leq a_i \leq 10^{18}\)。
题解
就我的俩 log 的二分会 T。。。
考虑怎么省去一个 log,我们不二分,还是考虑每个质数 \(p\),设一个答案 \(N\),则 \(N!\) 中包含 \(p\) 的个数为 \(\sum_{x=1}^{\infty}{\lfloor \frac{N}{p^x} \rfloor}\)。
这等价于把 \(N\) 变成 \(p\) 进制,设第 \(k\) 为 \(p\) 进制的值为 \(v\),那么这位上的贡献就是 \((vv \cdots v)_p\)(即 \(p\) 进制下 \(k\) 个 \(v\) 的值),显然每一位上的贡献独立,于是预处理一下幂指数、前缀和啥的就可以 \(O(1)\) 算出 \(p\) 进制数上每一位的的值了。
然后对于 \(m\) 个质数分别做一遍,取最大值,记得还要和 \(1\) 取最大值。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define LL long long
LL read() {
LL x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define N 1000
#define maxn 110
#define Range (LL)1e18
bool vis[N];
int cp, prime[N], cntp[maxn];
LL pown[maxn][maxn], full[maxn][maxn];
void init() {
for(int i = 2; i < N; i++) {
if(!vis[i]) prime[++cp] = i;
for(int j = 1; j <= cp && prime[j] * i < N; j++) {
vis[prime[j]*i] = 1;
if(i % prime[j] == 0) break;
}
}
for(int i = 1; i <= 100; i++) {
pown[i][0] = 1;
full[i][0] = 0;
for(int j = 1; pown[i][j-1] <= Range / prime[i]; j++) {
cntp[i] = j;
pown[i][j] = pown[i][j-1] * prime[i];
full[i][j] = full[i][j-1] + pown[i][j] - 1;
// printf("full[%d][%d] = %lld\n", i, j, full[i][j]);
if(full[i][j] + pown[i][j] - 1 > Range) break;
}
}
return ;
}
void work() {
int n = read();
LL ans = 1;
for(int i = 1; i <= n; i++) {
LL need = read(), tmp = 0;
if(need < 1) continue;
int j;
for(j = 1; full[i][j] < need; j++) ;
// putchar('(');
for(; j; j--) {
LL now = (pown[i][j] - 1) / (prime[i] - 1), minx = (need - full[i][j-1] + now - 1) / now;
tmp += minx * pown[i][j];
// printf("[%lld - %lld + %lld - 1 %lld]", need, full[i][j-1], now, minx);
need -= minx * now;
if(need <= 0) break;
}
// printf("[0])%d %lld\n", prime[i], tmp);
ans = max(ans, tmp);
}
printf("%lld\n", ans);
return ;
}
int main() {
init();
int T = read();
while(T--) work();
return 0;
}
[LOJ#530]「LibreOJ β Round #5」最小倍数的更多相关文章
- 【数位贪心】loj#530. 「LibreOJ β Round #5」最小倍数
记录一下题解里写的算法四 题目描述 $1 \le T \le 10^4,1\le m\le 100,0\le a_i\le 10^{18}$. 题目分析 题解里的算法四是这么写的 主要是这个$\alp ...
- [LOJ#526]「LibreOJ β Round #4」子集
[LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
- [LOJ#516]「LibreOJ β Round #2」DP 一般看规律
[LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- [LOJ#525]「LibreOJ β Round #4」多项式
[LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...
- loj #547. 「LibreOJ β Round #7」匹配字符串
#547. 「LibreOJ β Round #7」匹配字符串 题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
随机推荐
- Wannafly Union Goodbye 2016-A//初识随机化~
想来想去还是把这个题写下来了.自己在补题遇到了许多问题. 给出n(n<=1e5)个点,求是否存在多于p(p>=20)×n/100的点在一条直线上... 时限20s,多组数据,暴力至少n^2 ...
- 2018.3.16 Ubuntu 解决中文乱码问题
一.乱码的样子类似: °²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹,°²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹ 这种乱码称为Gedit中文乱码 打开部分Windows下的txt文本文件的时候,中文显示为乱码.但 ...
- docker单主机网络
当你安装Docker时,它会自动创建三个网络.你可以使用以下docker network ls命令列出这些网络: [root@localhost ~]# docker network ls NETWO ...
- ios sinaweibo 客户端(三)
这个页面要讲述的是用户的粉丝列表,下面是效果图: 可以看到这个视图明显也是一个tableview,在每一个cell中包含的有三个部分的内容:粉丝头像image,粉丝昵称label,我和粉丝之间的相互关 ...
- mac Parallels Desttop 13 win7/win8 无法连接网络
把 “源” 从共享网络改为"Wi-Fi" 在mac 这边点击菜单栏windows图标,选配置(如果没有配置,点控制中心,在点控制中心的齿轮,)选 硬件 找到网络 解锁,上边第一行就 ...
- Java使用ResourceBundle类读取properties文件中文乱码的解决方案
Java使用java.util.ResourceBundle类的方式来读取properties文件时不支持中文,要想支持中文必须将文件设置为ISO-8859-1编码格式,这对于开发工具默认为UTF-8 ...
- python可视化动态图表: 关于pyecharts的sankey桑基图绘制
最近因工作原因,需要处理一些数据,顺便学习一下动态图表的绘制.本质是使具有源头的流动信息能够准确找到其上下级关系和流向. 数据来源是csv文件 导入成为dataframe之后,列为其车辆的各部件供应商 ...
- python2和python3,字典和json
Python2的标准数据类型有: Numbers (数字) String (字符串) List (列表) Tuple (元组) Dictionary (字典) Python3的标准数据类型有: Num ...
- 利用for循环和range输出9 * 9乘法口诀表
li = [2, 3, 4, 5, 6, 7, 8, 9, 10] for i in li: for j in range(1, i): print('{0} * {1} = {2}'.format( ...
- 笔记-python-centos环境下安装配置
笔记-python-centos环境下安装配置 1. 准备工作 环境准备 centos6.5 mini,已有python 2.6.6 下载源码包 Python官网下载Gzipped sour ...