2018年10月5日提高组模拟赛 T1 阶乘

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82943460

大意

n n 个正整数 a [ i ] a[i] ,设它们乘积为 p p ,你可以给 p p 乘上一个正整数 q q ,使 p × q p\times q 刚好为正整数 m m 的阶乘,求 m m 的最小值


思路

首先这道题数据很大,暴力肯定是不行的
因为样例给的很狗血,所以我们手打一组数据一起理解

输入

5
3 5 7 9 12

输出

9

解释

9 ! / 3 × 5 × 7 × 9 × 12 = 40 9!/(3\times 5\times 7\times 9\times 12)=40
那么我们怎么去找到这个9呢?
首先 9 ! = 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 9!=1\times 2\times 3\times 4\times 5\times 6\times 7\times 8\times 9
而数据 p = 3 × 5 × 7 × 9 × 12 p=3\times 5\times 7\times 9\times 12 看起来并没有什么联系,我们此时分解一下质因数
8 ! = 2 7 × 3 2 × 5 1 × 7 1 8!=2^7\times 3^2\times 5^1\times 7^1
p = 2 2 × 3 3 × 5 0 × 7 1 p=2^2\times 3^3\times 5^0\times 7^1
9 ! = 2 7 × 3 4 × 5 1 × 7 1 9!=2^7\times 3^4\times 5^1\times 7^1
可以发现, m ! m! 对应的指数是一定不小于 p p 的,所以我们需要知道如果要让指数不小于 p p ,最小需要是几的阶乘


代码

#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);//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82943460
今日推荐