题目描述
给定n组询问,每组询问给定三个整数a,b,p,其中p是质数,请你输出Cba mod p的值。
输入格式
第一行包含整数n。
接下来n行,每行包含一组a,b,p。
输出格式
共n行,每行输出一个询问的解。
数据范围
1≤n≤20,
1≤b≤a≤1018,
1≤p≤105,
输入样例:
3
5 3 7
3 1 5
6 4 13
输出样例:
3
3
2
主要考点
C ++ 代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
int n, p;
//快速幂求a^k (mod p)
int qmi(int a, int k, int p){
int res = 1;
while(k){
if(k & 1) res = (LL) res * a % p;
a = (LL) a * a % p;
k >>= 1;
}
return res;
}
//计算c(a, b)
int c(int a, int b, int p){
if(a < b) return 0;
int res = 1;
for(int i = 1, j = a; i <= b; i ++, j --){
res = (LL) res * j % p;//计算a(a - 1)···(a - b - 1)
res = (LL) res * qmi(i, p - 2, p) % p;//计算 b !
}
return res;
}
//公式:c(a, b) = c(a % p, b % p)·(a / p, b / p)
int lucas(LL a, LL b, int p){
if(a < p && b < p) return c(a, b, p);
return (LL) c(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}
int main(){
cin >> n;
while(n --){
LL a, b;
cin >> a >> b >> p;
cout << lucas(a, b, p) << endl;
}
return 0;
}