版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/89212508
求
数据范围
定理
若
是质数,则对于任意整数
,有:
#include<cstdio>
#include<cctype>
using namespace std;typedef long long LL;
const int N=100010;
LL fac[N]={1,1},inv[N]={1,1},n,m,p,t;
inline LL read()
{
char c;int f=0,d=1;
while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
inline void write(LL x){if(x>9)write(x/10);putchar(x%10+48);return;}
inline LL ksm(LL x,LL y)
{
LL ans;
for(ans=1;y;(x*=x)%=p,y>>=1) if(y&1)(ans*=x)%=p;
return ans;
}
inline LL C(LL n,LL m){if(n<m) return 0;return (fac[n]*inv[m]%p*inv[n-m]%p)%p;}
inline LL Lucas(LL n,LL m){if(!m)return 1;return C(n%p,m%p)*Lucas(n/p,m/p)%p;}
signed main()
{
t=read();
while(t--)
{
n=read();m=read();p=read();
for(register int i=2;i<=p;i++) (fac[i]=fac[i-1]*i)%=p;inv[p-1]=ksm(fac[p-1],p-2);
for(register int i=p-2;i>1;i--) inv[i]=(inv[i+1]*(i+1))%p;
printf("%lld\n",Lucas(n+m,n));
}
}