题目链接:点击这里
Lucas定理
若
是质数,则对于任意整数
有:
也就是把
和
表示成
进制数,对
进制下的每一位分别计算组合数,最后再乘起来。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int p;
int qmi(int a ,int b) // 快速幂模板
{
int res = 1;
while(b)
{
if(b & 1) res = (ll)res * a % p;
a = (ll)a * a % p;
b >>= 1;
}
return res;
}
int C(int a, int b) // 通过定义求组合数C(a, b)
{
int res = 1;
for(int i = 1, j = a; i <= b; ++i, --j)
{
res = (ll)res * j % p;
res = (ll)res * qmi(i, p - 2) % p;
}
return res;
}
int lucas(ll a, ll b)
{
if(a < p && b < p) return C(a, b);
return (ll)C(a % p, b % p) * lucas(a / p, b / p) % p;
}
int main()
{
int n;
scanf("%d", &n);
while(n--)
{
ll a, b;
scanf("%lld%lld%d", &a, &b, &p);
printf("%d\n", lucas(a, b));
}
return 0;
}