You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
922 B

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
// 快速幂
int qmi(int a, int k, int p) {
int res = 1;
while (k) {
if (k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
// 功能:组合数模板
int C(int a, int b, int p) {
if (a < b) return 0;
int down = 1, up = 1;
for (int i = a, j = 1; j <= b; i--, j++) {
up = up * i % p;
down = down * j % p;
}
return up * qmi(down, p - 2, p) % p;
}
// Lucas公式
int lucas(int a, int b, int p) {
if (a < p && b < p) return C(a, b, p);
return C(a % p, b % p, p) * lucas(a / p, b / p, p) % p; // 递归套用公式
}
int n, p;
signed main() {
cin >> n;
while (n--) { // n组询问
int a, b;
cin >> a >> b >> p;
cout << lucas(a, b, p) << endl; // 利用lucas公式计算组合数
}
return 0;
}