模板-组合数comb
使用前需要初始化,执行一次comb.init(n),n为C(n,m)中最大的n。初始化时间复杂度为O(n),后续每次求comb(n,m)时间复杂度为O(1)。
std::vector<mint> fac, ifac;
struct Comb {
void init(int n) {
fac.assign(n + 1, 1);
for (int i = 1; i <= n; i++) {
fac[i] = fac[i - 1] * i;
}
ifac.resize(n + 1);
ifac[n] = fac[n].inv();
for (int i = n - 1; i >= 0; i--) {
ifac[i] = ifac[i + 1] * (i + 1);
}
}
int operator()(int n, int k) {
assert(n <= fac.size());
mint ans = fac[n] * ifac[k] * ifac[n - k];
return ans.val();
}
}comb;
浙公网安备 33010602011771号