思路
现在令一个素数
p
p
p,因为阶乘
n
!
=
(
n
)
∗
(
n
−
1
)
∗
(
n
−
2
)
∗
…
…
∗
2
∗
1
n!=(n)*(n-1)*(n-2)*……*2*1
n!=(n)∗(n−1)∗(n−2)∗……∗2∗1,所以
n
p
\frac{n}{p}
pn代表的是
n
!
n!
n!里面有几个数有
p
p
p这个因子,同理
n
p
k
\frac{n}{p^k}
pkn代表的是
n
!
n!
n!里面有几个数有
p
k
p^k
pk这个因子,从小到大遍历一遍,
p
p
p这个结果就是
∑
i
=
1
p
i
<
=
n
n
p
i
\displaystyle\sum_{i=1}^{p^i<=n}\frac{n}{p^i}
i=1∑pi<=npin
#include<iostream>
using namespace std;
typedef long long ll;
const ll N=2102100;
ll primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(ll n)
{
for (ll i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (ll j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
int main(){
ll n;
cin>>n;
get_primes(n);
for(ll i=0;i<cnt;i++){
ll ans=0;
for(ll j=primes[i];j<=n;j*=primes[i]){
if(j>n)break;
ans+=(n/j);
}
cout<<primes[i]<<" "<<ans<<endl;
}
}