题目:
https://www.luogu.org/problemnew/show/P3807
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int tmax=1e5+5;
ll fac[tmax],rev[tmax],p;
ll C(ll n,ll m)
{
if(n<m) return 0;
return fac[n]*rev[m]%p*rev[n-m]%p;
}
ll lucas(ll n,ll m)
{
if(m==0) return 1;
return lucas(n/p,m/p)*C(n%p,m%p)%p;
}
ll quick_pow(ll base,ll k)
{
ll sum=1;
while(k>0)
{
if(k&1) sum=sum*base%p;
base=base*base%p;
k>>=1;
}
return sum;
}
void init()
{
fac[0]=fac[1]=rev[0]=rev[1]=1;
for(ll i=2;i<=p;i++)
{
fac[i]=fac[i-1]*i%p;
rev[i]=quick_pow(fac[i],p-2);
}
return;
}
int main()
{
int T;
ll n,m;
cin>>T;
while(T--)
{
scanf("%lld%lld%lld",&n,&m,&p);
init();
printf("%lld\n",lucas(n+m,m));
}
return 0;
}