1. 程式人生 > 其它 >【模板】求組合數

【模板】求組合數

(1)楊輝三角

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
unsigned long long bj[2005][2005],c[2005][2005],z[2005][2005];
int k;
inline int read(){
    int s=0
,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int init(){ for(int i=0;i<=2000;i++) c[i][0]=c[i][i]=1; for(int i=1;i<=2000;i++) for(int j=1;j<=i;j++){ c[i][j]
=(c[i-1][j]+c[i-1][j-1])%k; } return 0; } int main(){ ios::sync_with_stdio(false); int T=read(); k=read(); init(); while(T--){ int x=read(),y=read(); cout<<c[x][y]<<'\n'; } return 0; }

(2)Lucas定理

#include<iostream>
#include<cstdio>
const
int MOD=2013; int jc[MOD+5]; int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } int x,y; void Extended_gcd(int a,int b){ if(b==0){ x=1; y=0; } else{ Extended_gcd(b,a%b); long t=x; x=y; y=t-(a/b)*y; } } int C(int a,int b){ if(b>a) return 0; b=(jc[a-b]*jc[b])%MOD; a=jc[a]; int c=gcd(a,b); a/=c; b/=c; Extended_gcd(b,MOD); x=(x+MOD)%MOD; x=(x*a)%MOD; return x; } int Combination(int n, int m){ int ans=1; int a,b; while(m||n){ a=n%MOD; b=m%MOD; n/=MOD; m/=MOD; ans=(ans*C(a,b))%MOD; } return ans; } int init(){ jc[0]=1; for(int i=1;i<=MOD;i++) jc[i]=(jc[i-1]*i)%MOD; } int main(){ int m,n; while(~scanf("%d%d",&n,&m)){ printf("%d\n",Combination(n,m)); } return 0; }