首页 > 代码库 > N!的素因子分解
N!的素因子分解
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; }
N!的素因子分解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。