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
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;
|
|
} |