#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)); } }
个人模板 组合数 C(m,n)
最新推荐文章于 2023-08-15 22:30:33 发布