首页 > 代码库 > N!的素因子分解

N!的素因子分解

N! = p1^t1*p2^t2*pi^ti*pk^tk(其中p1p2……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;
}


N!的素因子分解