AcWing 886. 求组合数 II
原题链接
简单
作者:
coquetish
,
2024-11-26 00:36:29
,
所有人可见
,
阅读 6
倒着处理阶乘的逆元会快很多,只有$50ms$,调用快速幂的次数减少了,只有一次。
时间复杂度 $O(n)$
#include <bits/stdc++.h>
#define sz(a, b) ((a + b - 1) / b)
#define all(_) _.begin(), _.end()
using namespace std;
const int N = 1'00'000;
const int mod = 1'000'000'007;
#define int long long
int fac[N + 50], infac[N + 50];
signed main() {
cin.tie(nullptr) -> ios::sync_with_stdio(false);
fac[0] = 1;
for(int i = 1; i <= N; i ++) {
fac[i] = fac[i - 1] * i % mod;
}
auto fpow = [&](int a, int b) -> int{
int res = 1;
for(; b; b /= 2) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
}
return res;
};
infac[N] = fpow(fac[N], mod - 2);
for(int i = N - 1; i >= 0; i --) {
infac[i] = infac[i + 1] * (i + 1) % mod;
}
auto C = [&](int a, int b) -> int{
if(a < 0 || b < 0 || a < b) return 0;
return fac[a] * infac[a - b] % mod * infac[b] % mod;
};
int n;
cin >> n;
for(; n--; ) {
int a, b;
cin >> a >> b;
cout << C(a, b) << "\n";
}
}