题目
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cbamod(109+7) 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组 a 和 b。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤105
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010, mod = 1e9+7;
int fact[N], infact[N];
// 快速幂
int qmi(int a, int b, int p){
int res = 1;
while(b){
if(b & 1) res = (LL) res * a % p;
a = (LL) a * a % p;
b >>= 1;
}
return res;
}
int main()
{
int n;
cin >> n;
// 预处理出阶乘数组fact[]与逆元阶乘数组infact[]
// C(a,b) = a! / (b! * (a-b)!) == a! * (b!)^-1 * ((a-b)!)^-1
// 逆元的阶乘:(b!)^-1 = ((b-1)!)^-1 * b^-1
// 费马小定理:如果a与p互质,并且a不是p的倍数,a*a^-1 = 1
// 那么 a^(p-1) = 1 (mod p) => a*a^(p-2) = 1 (mod p) => a模p的逆元a^-1是a^(p-2)
fact[0] = infact[0] = 1;
for(int i = 1; i < N; i++){
fact[i] = (LL)fact[i-1] * i % mod;
infact[i] = (LL)infact[i-1] * qmi(i, mod-2, mod) % mod;
}
while (n --){
int a, b;
cin >> a >> b;
printf("%d\n", (LL)fact[a] * infact[b] % mod * infact[a-b] % mod);
}
return 0;
}