chenfy27的刷题记录

导航

模板-组合数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;

posted on 2024-10-16 12:37  chenfy27  阅读(40)  评论(0)    收藏  举报