思路:如果要把1~n逐个分解质因数并求和,时间复杂度过高.
在1~n当中,至少含有一个p作为质因子的数一共有n/p个,至少含有两个p的一共有n/(p^2)个,假如p^3已经大于n,则n!一共含有n/p+n/(p^2)个质因子p。
在n!中的质因子p的出现次数。
步骤:
第一步:求出1~n之间的所有质数。
第二步:统计p在n!中的出现次数
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int u;
int primes[N],cnt[N];
bool st[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[++u]=i;
for(int j=1;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int get(int n,int p)
{
int s=0;
while(n)
{
s+=n/p;
n/=p;
}
return s;
}
int main()
{
int n;
cin>>n;
get_primes(n);
for(int i=1;i<=u;i++)
{
int p=primes[i];
cnt[i]=get(n,p);
}
for(int i=1;i<=u;i++)
{
cout<<primes[i]<<' '<<cnt[i]<<endl;
}
return 0;
}