题目描述
给定整数 ,试把阶乘 分解质因数,按照算术基本定理的形式输出分解结果中的 和 即可。
算法分析
一个一个分解显然不可行,我们考虑对于每个质数,计算它在 中每个数分解质因数后对应的指数和。
先想,至少包含一个质因子 的个数是多少,显然是 。
那么,至少包含两个质因子 的个数是多少,显然是 。
以此类推。
由于包含 个质因子的数中的前 个质因子已经在之前的情况中统计过,只需要累加当前结果就可以了。
对于每个质数 ,最多循环 次,因此时间复杂度为 。
注意避免中间结果溢出。
代码实现
#include <cstdio>
#include <cstring>
int notprime[1000005],prime[1000005],idx=0;
inline void getPrime(int n) {
idx=0;memset(notprime,0,sizeof(notprime));
for(int i=2;i<=n;++i) {
if(!notprime[i]) prime[idx++]=i;
for(int j=0;j<idx&&i*prime[j]<=n;++j) {
notprime[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
int main() {
int n;scanf("%d",&n);
getPrime(n);
for(int i=0;i<idx;++i) {
int ans=0;
for(long long int j=prime[i];j<=n;j=j*prime[i]) ans+=n/j;
printf("%d %d\n",prime[i],ans);
}
return 0;
}