N! = p1^t1*p2^t2*…pi^ti…*pk^tk(其中p1,p2……pk是素数,1<N<= 10^6)
很明显我们首先要筛出小于等于n的所有素数
然后我们将n分成两部分考虑,
1)为某个素因子的倍数,2)不是这个因子的倍数
例如: f(n,2)
n!=(2*4*6*....n)*(1*3*5*.....*(n-1))
=2^(n/2)*(1*2*3*4*......n/2)*(1*3*5*..(n-1)) 得到了
......
因此我们就得到了递推公式 对某个因子的次数 f(n,p) = f(n/p,p)+ n/p ;
下面这个还讲了关于这个问题的推广
http://www.cnblogs.com/openorz/archive/2011/11/14/2248992.html
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 10000010;
int prime[maxn],cnt;
int ans[maxn];
bool is[maxn];
void init(int n)
{
cnt=0;
memset(is,1,sizeof(is));
memset(ans,0,sizeof(ans));
memset(prime,0,sizeof(prime));
for(int i=2;i<=n;i++){
if(is[i]){
prime[cnt++]=i;
for(int j=i+i;j<=n;j+=i)
is[j]=0;
}
}
}
int fen(int n,int p)
{
if(n==0) return 0;
return fen(n/p,p)+n/p;
}
int main()
{
int n;
while(~scanf("%d",&n)){
init(n);
for(int i=0;i<cnt;i++)
ans[i]=fen(n,prime[i]);
for(int i=0;i<cnt;i++)
printf("%d^%d\n",prime[i],ans[i]);
}
return 0;
}