给定n组询问,每组询问给定两个整数a,b,请你输出Cba mod (10^9+7)的值。
输入格式
第一行包含整数n。
接下来n行,每行包含一组a和b。
输出格式
共n行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤10^5
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
a! / (b! * (a - b)!) 通过逆元来求其结果 --> a! * inv(b!) * inv((a - b)!)
a! = (a - 1)! * a
inv((a - b)!) = inv((a - b - 1)!) * inv(b)
#include<iostream>
using namespace std;
const int p = 1e9 + 7;
typedef long long LL;
int fact[100010],infact[100010];
int qmi(int a,int k,int p){
int res = 1;
while(k){
if (k&1){
res = (LL)res*a % p; // 注意两个数字相乘的时候要转成long long
}
a = (LL)a * a % p;
k >>= 1;
}
return res;
}
void init(){
fact[0] = infact[0] = 1;
for (int i = 1 ; i <= 100000; ++i){
fact[i] = (LL)fact[i - 1] * i % p;
infact[i] = (LL)infact[i - 1] * qmi(i,p - 2,p) % p; // infact[i] 是 i的阶乘的逆元
}
}
int main(){
int n,a,b;
cin>>n;
init();
while(n--){
scanf("%d%d",&a,&b);
printf("%d\n",(LL)fact[a] * infact[b] % p * infact[a - b] % p); // 3个连乘要对p取两次模
}
return 0;
}