N!的最大质因子不超过N。
先质数筛出N以内质数,然后算在N!出现了多少次。
对于质数p,只有质数p的倍数才含p。
至少含有一个p的有个;含有两个p的有个,但是有一个p已经记在里了,所以p的个数只加,之后p的n次方都同理。
#include <iostream>
#include <cstring>
#include <cmath>
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1e6+10;
LL n,pri[N],vis[N],c[N];
void prime()
{
ms(vis,0);
pri[0]=0;
for(LL i=2;i<=1e6;i++)
{
if(!vis[i])
pri[++pri[0]]=i;
for(LL j=1;j<=pri[0]&&pri[j]*i<=1e6;j++)
{
vis[pri[j]*i]=1;
if(i%pri[j]==0)
break;
}
}
}
int main()
{
prime();
cin>>n;
for(LL i=1;i<=pri[0]&&pri[i]<=n;i++)
{
for(LL j=pri[i];j<=n;j*=pri[i])
c[i]+=n/j;
}
for(LL i=1;i<=pri[0]&&pri[i]<=n;i++)
{
if(c[i])
cout<<pri[i]<<' '<<c[i]<<endl;
}
return 0;
}
涉及到超int的运算,直接全开long long!