#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e5+10; int a[maxn]; int quick(int a,int n,int p) { int ans=1; while(n) { if(n&1) ans=ans%p*a%p; a=a%p*a%p; n>>=1; } return ans%p; } int C(int x,int y,int p) // C(x,y); { if(x<y) return 0; a[0]=1; for(int i=1;i<=p;i++) a[i]=(a[i-1]*i)%p; // i!%p int s=a[x]; int t=a[x-y]*a[y]; s=s*quick(t,p-2,p); return s; } int lucas(int n,int m,int p) { if(m==0) return 1; return lucas(n/p,m/p,p)%p*C(n%p,m%p,p)%p; } int32_t main() { int T; cin>>T; while(T--) { int n,m,p;cin>>n>>m>>p; n+=m; cout<<lucas(n,m,p)<<endl; } }
给定n,m,p(1e5内) C(n+m,m)%p;
保证P为prime
C表示组合数。
一个测试点内包含多组数据。