原题链接:197. 阶乘分解 - AcWing题库
解题思路:首先,N!等于1-N的每一个数相乘,只要能求出每一个数的质因数即可获得答案。而在1-N中,任何一个数x都拥有N/x个倍数,那么可得出任何一个质数x,在N中也都拥有N/x个倍数。
但有的数字可能包含有多个相同质数,所以还需要对x^2,x^3等也仅需如上操作。
因为能被x^2的数说明至少拥有两个x作为质因数。而由于在N/x的时候我们已经记录过这个数,只需要要累加N/x^2即可,并不需要乘以2。
接着继续获得N/x^2,N/x^3...等数的答案直到x^k>N为止。最终的和就是该质数在N!中作为质因数的总量了。
对小于N的每一个质数进行如上操作,就能解出答案。
AC代码:
#include<bits/stdc++.h>
using namespace std;
long long v[10000000],prime[10000000];//V记录每个数字的最小质因数,prime记录质数
long long p_length=0;//记录当前质数数量
long long n;//题目原意
long long ans;//记录质数在N!中的数量
int main(){
cin>>n;
for(long long i=2;i<=n;i++){//初始化,线性筛
if(!v[i]){
v[i]=i;
prime[p_length++]=i;
}
for(long long j=0;j<p_length;j++){
if(prime[j]>v[i]||prime[j]*i>n) break;
v[prime[j]*i]=prime[j];
}
}
for(long long i=0;i<p_length;i++){//遍历每一个质数,查找其在N!中的数量
long long buffer;//缓存当前质数的值
buffer=prime[i];
ans=0;
for(buffer;buffer<=n;){
ans+=n/buffer;
buffer*=prime[i];//每次指数增加1
}
cout<<prime[i]<<' '<<ans<<endl;//输出答案
}
return 0;
}