#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
const ll maxn = 1e5+15;
ll n,m,p,T,fac[maxn];
ll pow(ll b,ll q)//求逆元,费马小定理
{
ll ans=1;
for(;q;q>>=1,b=b*b%p) {
if(q&1) ans=ans*b%p;
}
return ans%p;
}
ll C(ll n,ll m)
{
if(m > n)return 0;
return fac[n]*pow((fac[m]*fac[n-m])%p,p-2)%p;
}
ll Lucas(ll n,ll m)
{
if(m == 0) return 1;
return (Lucas(n/p,m/p)*C(n%p,m%p))%p;//进入到C中的参数均小于P,所以初始阶乘时只需预处理到p即可
//这也是卢卡斯定理只适用与p<1e5的原因
}
int main()
{
cin>>T;
while(T--) {
cin>>n>>m>>p;
fac[0] = 1;;
for(int i=1;i<=p;i++)fac[i] = fac[i-1]*i%p;//预处理出阶乘
printf("%lld\n",Lucas(n+m,m)%p);
}
return 0;
}
请问为什么函数调用的是 lucas(n+m,m)