题目:
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cab 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太大,如果还是采用递推公式去推的话,时间复杂度为10^5 * 10 ^ 5 = 10 ^ 10,这绝对会TLE。
我们通过Cab = a! / b! (a - b)!,分别求出a!,1/b!,1/(a - b)!,然后再求出Cab,这里我们求1/b!,1/(a - b)!时,只需要求b!、(a - b)!的逆元就行了。
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 100005, p = 1e9 + 7;
//fact数组求阶乘,infact数组求阶乘的逆元
int fact[N], infact[N];
//求快速幂
int qmi(int a, int i, int p)
{
int res = 1;
while(i){
if(i & 1) res = (ll)res * a % p;
a = (ll)a * a % p;
i >>= 1;
}
return res;
}
int main()
{
int n;
cin >> n;
fact[0] = infact[0] = 1;
for(int i = 1; i < 100005; i ++){
fact[i] = (ll)fact[i - 1] * i % p;
//求阶乘的逆元
infact[i] = (ll)infact[i - 1] * qmi(i, p - 2, p) % p;
}
while(n --){
int a, b;
cin >> a >> b;
cout << (ll)fact[a] * infact[b] % p * infact[a - b] % p << endl;
}
}