思路:
板子,不会证,直接用结论。
用于求大组合数
c(n,m)%mod=C(n%mod,m%mod)*C(n/mod,m/mod)%mod
#include<bits/stdc++.h> #define ll long long using namespace std; int T; ll n,m,p; ll a[100005]; inline ll read() { bool f=0;ll x=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();} return f?-x:x; } ll ks(ll x,ll k) { ll num=1; while(k) { if(k&1) num=num*x%p; x=x*x%p; k>>=1; } return num; } ll c(ll n,ll m) { if(m>n)return 0; return ((a[n]*ks(a[m],p-2))%p*ks(a[n-m],p-2)%p);//直接求出小范围数的组合数 } ll lucas(ll n,ll m) { if(!m)return 1; return c(n%p,m%p)*lucas(n/p,m/p)%p;//递归缩小范围 } int main() { T=read(); while(T--) { n=read();m=read();p=read(); a[0]=1; for(int i=1;i<=p;i++)a[i]=(a[i-1]*i)%p; cout<<lucas(n+m,n)<<endl; } return 0; }