题目
就是给你\(n\)让你把\(n!\)分解质因数。
当然直接乘起来再分解是不可能的,我们需要更快的算法。
首先用欧拉筛筛出\(1-n\)所有的素数,不难发现,对于每个素数,在\(n!\)里面出现了
\[\sum_{p^k\leq n} \lfloor \frac{n}{p^k} \rfloor \]
次
直接套公式即可
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e6+5;
int prime[N],cnt,n;
bool isp[N];
int c[N];
void sieve(int n) {
isp[0]=isp[1]=true;
for(int i=2;i<=n;i++) {
if(!isp[i])
prime[++cnt]=i;
for(int j=1;j<=cnt and prime[j]*i<=n;j++) {
isp[prime[j]*i]=true;
if(i%prime[j]==0)
break;
}
}
}
int main() {
cin>>n;
sieve(n);
for(int i=1;i<=cnt;i++) {
long long l=prime[i];
while(l<=n) {
c[i]+=n/l;
l*=prime[i];
}
}
for(int i=1;i<=cnt;i++)
cout<<prime[i]<<' '<<c[i]<<endl;
return 0;
}