题目
Lucas定理要求mod为素数
#include<stdio.h>
#include <string.h>
using namespace std;
#define Mod 1000000007
typedef long long LL;
LL mod;
/*
根据费马小定理:
已知(a, p) = 1,则 a^(p-1) ≡ 1 (mod p), 所以 a*a^(p-2) ≡ 1 (mod p)。
也就是 (m!)的取模逆元为 (m!)^p-2 ;
*/
LL quick_mod(LL a, LL b)
{
LL ans = 1;
a %= mod;
while(b)
{
if(b & 1)
{
ans = ans * a % mod;
}
b >>= 1;
a = a * a % mod;
}
return ans;
}
LL C(LL a, LL b) {
if(a < b) return 0;
LL ans = 1, ca = 1, cb = 1;
for(LL i = 0; i < b; ++i) {
ca = (ca * (a - i))%mod;
cb = (cb * (b - i))%mod;
}
ans = (ca*quick_mod(cb, mod - 2)) % mod;
return ans;
}
LL Lucas(LL n,LL m)
{
if(m==0) return 1;
return C(n%mod,m%mod)*Lucas(n/mod,m/mod);
}
int main()
{
int t;
scanf("%d",&t);
LL a,b;
while(t--)
{
scanf("%I64d%I64d%I64d",&a,&b,&mod);
printf("%I64d\n",Lucas(a,b));
}
}