【模板】求組合數
阿新 • • 發佈:2021-08-20
(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> constint 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; }