组合数的逆元写法
看别人的没看明白,顺着自己思路写了一下
其实也没什么好讲的,就是公式的写法,打表了 n!,还有对应的逆元inv。
组合的公式: $C^m_n = \frac{n!}{ m!(n-m)!}$
之后把分母换成对应的inv就行了
#include <iostream>
#define ll long long
using namespace std;
const int N = 1e5+5,mod= 1e9+7;
int a,b,t;
ll c[N], inv[N];
ll qpow(ll a,int b){
ll ans = 1;
while(b){
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int main(){
cin >> t;
// 求排列数
c[0] = 1;
for(int i=1;i<=N;i++) c[i] = c[i-1] * i % mod;
// 求排列数的逆元
// b的逆元就是 b^(mod-2)
inv[N-1] = qpow(c[N-1], mod - 2);
for(int i = N-2;i >= 0;i--)
inv[i] = inv[i + 1] * (i + 1) % mod;
while(t--){
cin >> a >> b;
cout << c[a] * inv[b] % mod * inv[a-b] % mod << "\n";
// 逆元使用:
// a / b % mod == a * inv[b] % mod;
// 直接替换了就行
}
return 0;
}