Lucas定理 发表于 2018-07-26 | 分类于 OI 字数统计: 240 | 阅读时长 ≈ 1 证明省略 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<cstdio>#define LL long longconst int N=200050;LL fact[N];int n,m,mod;inline int read(){ register int x=0,t=1; register char ch=getchar(); while (ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); if (ch=='-') t=-1,ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*t;}void init(){ fact[0]=1; for(int i=1;i<=n+m;i++) fact[i]=fact[i-1]*i%mod;}LL pow(LL a,LL b,LL mod){ LL ret=1; for(;b;b>>=1) { if (b&1) ret=ret*a%mod; a=a*a%mod; } return ret;}LL C(LL m,LL n,LL mod){ if (m<n) return 0; return fact[m]*pow(fact[n]*fact[m-n]%mod,mod-2,mod)%mod;}LL Lucas(LL m,LL n,LL mod){ if (!n) return 1; return Lucas(m/mod,n/mod,mod)*C(m%mod,n%mod,mod)%mod;}int main(){ int T=read(); while (T--) { n=read(),m=read(); mod=read(); init(); printf("%lld\n",Lucas(n+m,m,mod)); } return 0;}