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!