前言
传送门 :
思路
根据算数基本定理
N
=
p
1
a
1
∗
p
2
a
2
.
.
.
p
n
a
n
N = p1^{a1}*p2^{a2}...pn^{an}
N=p1a1∗p2a2...pnan
又 N ! = N ∗ ( N − 1 ) ∗ ( N − 2 ) . . . 1 N! =N*(N-1)*(N-2)...1 N!=N∗(N−1)∗(N−2)...1
所以暴力解法我们可以知道
s u m ( N ! ) = p 1 a 1 + a 2 + . . . + a 3 + a k + p 2 a 1 + a 2 + . . + a k . . . sum(N!) = p1^{a_1+a_2+...+a_3+a_k}+p2^{a_1+a_2+..+a_k}... sum(N!)=p1a1+a2+...+a3+ak+p2a1+a2+..+ak...
所有的 p p p都在 N N N内,所以我们可以先处理出所有的 p p p
然后遍历 p p p,求出所有 p p p的指数即可
Mycode
b
ool st[N];
int primes[N],cnt;
void get_Prime(int x){
for(int i=2;i<=x;i++){
if(st[i]) continue;
for(int j=2;j<=x/i;j++){
st[i*j] = 1;
}
}
for(int i=2;i<=x;i++){
if(!st[i])
primes[++cnt] = i ;
}
}
void solve()
{
int n;cin>>n;
get_Prime(n);//获取 1到n的所有质数
for(int i=1;i<=cnt;i++){
int temp = n;
int u = primes[i];
int ans = 0 ;
while(temp){
ans+=(temp/u);
temp/=u;
}
cout<<u<<" "<<ans<<endl;
}
}