版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82943460
大意
有 个正整数 ,设它们乘积为 ,你可以给 乘上一个正整数 ,使 刚好为正整数 的阶乘,求 的最小值
思路
首先这道题数据很大,暴力肯定是不行的
因为样例给的很狗血,所以我们手打一组数据一起理解
输入
5
3 5 7 9 12
输出
9
解释
那么我们怎么去找到这个9呢?
首先
而数据
看起来并没有什么联系,我们此时分解一下质因数
可以发现,
对应的指数是一定不小于
的,所以我们需要知道如果要让指数不小于
,最小需要是几的阶乘
代码
#include<cstdio>
using namespace std;int n,a,cx[100001],ans;
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)//分解质因数
{
scanf("%d",&a);
for(register int j=2;j*j<=a;j++)
while(a%j==0) cx[j]++,a/=j;
if(a!=1) cx[a]++;
}
for(register int i=2;i<100001;i++)//找到所有的质数
{
int cnt=i;//初始化
while(cx[i]>0)//这是一个质因数,我们计算至少要几的阶乘它的指数是大于p的指数的
{
a=cnt;//例如我一开始是5,而p中5对应的指数是2,而5!的指数是1,不行,就找10!,其中5的指数是2就可以了,所i这次的答案是10
while(a%i==0) a/=i,cx[i]--;//计算它含有几个对应的指数
cnt+=i;//考虑下一个倍数
}
if(cnt-i>ans) ans=cnt-i;//因为我们最后多加了一次,所以要减去
}
printf("%d",ans);//输出
}