盧克斯定理
阿新 • • 發佈:2021-07-12
求組合數 III 盧克斯定理
給定 nn 組詢問,每組詢問給定三個整數 a,b,p,其中 p 是質數,請你輸出 Cbamodp的值。
輸入格式
第一行包含整數 n。
接下來 n 行,每行包含一組 a,b,p。
輸出格式
共 n 行,每行輸出一個詢問的解。
資料範圍
1≤n≤20
1≤b≤a≤10`8
1≤p≤105
輸入樣例:
3
5 3 7
3 1 5
6 4 13
輸出樣例:
3
3
2
#include <iostream> #include <algorithm> using namespace std; typedef long long LL; int p; int qmi(int a, int k) { int res = 1; while (k) { if (k & 1) { res = (LL)res * a % p; } a = (LL)a * a % p; k >>= 1; } return res; } int C(int a, int 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; cin >> n; while (n--) { LL a, b; cin >> a >> b >> p; cout << lucas(a, b) << endl; } return 0; }