个人模板 组合数 C(m,n)

来源:互联网 发布:java license 框架 编辑:程序博客网 时间:2024/05/21 22:24
#include <bits/stdc++.h>  
const int maxn=1000000; #include <vector>  using namespace std; bool arr[maxn+1]={false}; vector<int> produce_prim_number() {         vector<int> prim;         prim.push_back(2);         int i,j;         for(i=3;i*i<=maxn;i+=2)         {                 if(!arr[i])                 {                         prim.push_back(i);                         for(j=i*i;j<=maxn;j+=i)                                 arr[j]=true;                 }         }         while(i<maxn)         {                 if(!arr[i])                         prim.push_back(i);                 i+=2;         }         return prim; } //计算n!中素数因子p的指数  int cal(int x,int p) {         int ans=0;         long long rec=p;         while(x>=rec)         {                 ans+=x/rec;                 rec*=p;         }         return ans; } //计算n的k次方对m取模,二分法  int pow(long long n,int k,int M) {         long long ans=1;         while(k)         {                 if(k&1)                 {                         ans=(ans*n)%M;                 }                 n=(n*n)%M;                 k>>=1;         }         return ans; } //计算C(n,m)  int combination(int n,int m) {         const int M=10007;         vector<int> prim=produce_prim_number();         long long ans=1;         int num;         for(int i=0;i<prim.size()&&prim[i]<=n;++i)         {                 num=cal(n,prim[i])-cal(m,prim[i])-cal(n-m,prim[i]);                 ans=(ans*pow(prim[i],num,M))%M;         }         return ans; } int main() {         int m,n;         while(~scanf("%d%d",&m,&n),m&&n)         {                 printf("%d\n",combination(m,n));         }         return 0; } 

#include<bits/stdc++.h>using namespace std;const int N = 10000 + 10;int n, m;int xx(int m)   /// O(n)计算C(m,n){    int c[N];    c[0] = 1;    for(int i = 1; i <= m; i++)    {        c[i] = c[i-1] * (n-i+1)/i;    }    return c[m];}int main(){    while(scanf("%d%d", &n, &m) == 2)    {        printf("%d\n", xx(m));    }}


                                             
0 0