预处理求组合数
$C_{a}^{b} = \frac{a!}{b!(a-b)!}$
所以只需要预处理出$a!$ ,$b!$的逆元,以及$(a-b)!$的逆元即可
同时注意一下代码
infact[i] = (ll)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
因为 $i! = (i-1)! \times i$
所以 $i!$ 的逆 = $(i-1)!$ 的逆 * $i$ 的逆
而i的逆易知可以是 $i^{mod - 2}$
#include <iostream>
using namespace std;
#define debug(a) cout << #a << ' ' << a << endl;
typedef long long ll;
const int NN = 1e5 + 10, mod = 1e9 + 7;
int n, a, b;
int fact[NN], infact[NN]; // fact是阶乘,infact是阶乘的逆元,两者都是对1e9+7取模
int qmi(int a, int m, int p){
int res = 1;
while (m){
if (m & 1) res = (ll)res * a % p;
a = (ll)a * a % p;
m >>= 1;
}
return res;
}
int main(){
cin >> n;
// 预处理所有阶乘
fact[0] = 1, infact[0] = 1;
for (int i = 1; i < NN; i ++){
fact[i] = (ll)fact[i - 1] * i % mod; // ll 不要忘记了!!!!
infact[i] = (ll)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
}
while (n --){
cin >> a >> b;
cout << (ll)fact[a] * infact[b] % mod * infact[a - b] % mod << endl; // 记得及时取模
}
return 0;
}