组合数的不同质因子

来源:互联网 发布:姓名签名设计软件 编辑:程序博客网 时间:2024/06/05 00:41

求组合数C(n,m)有多少个不同的质因子。
C(n,m)=n!/( m!*(n-m)! )
P(N!)=N/i+N/i^2+N/i^3+…..N/i^m是一个可以求N!中有多少个质因子i,例如7!中有4个质因子2,那么P(n!)=4;
既然知道了这个公式,枚举每个质数,分别求n!,m!,(n-m)!的质因子个数是否符合
P(n!)=p(m!)+p( (n-m)! )

#include <bits/stdc++.h>#define x first#define y secondusing namespace std;typedef long long LL;const int N=1e6+7;vector <int> v;bool p[N];int main(){#ifdef LOCAL    freopen("in.txt","r",stdin);#endif // LOCAL    memset(p,0,sizeof(p));    for(int i=2;i<N;i++)    {        if(!p[i])        {            v.push_back(i);            for(int j=i*2;j<N;j+=i) p[j]=1;        }    }    int n,m;    while(~scanf("%d%d",&n,&m)&&n+m)    {        int l=v.size(),ans=0;        cout<<l<<endl;        for(int i=0;i<l;i++)        {            if(v[i]>n) break;            int x=n,y=m,z=n-m,num=0;            while(x) num+=x/v[i],x/=v[i];            while(y) num-=y/v[i],y/=v[i];            while(z) num-=z/v[i],z/=v[i];            if(num) ans++;        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击