ホーム > libalgo

組み合わせ係数 nCr DP

概要

組み合わせ係数 $C(n,r)$ を求めます.$C(n,r) = C(n-1,r) + C(n-1,r-1)$ の漸化式に従ってメモ化再帰します.

計算量

初回は時間 $O(nr)$.空間 $O(nr)$.

実装

const ll mod = 1000000007;
const int MAX_N = 10000;  // 400MB
// const int MAX_N = 1024; // 4MB
// nCr % mod
ll nCr(int n, int r) {
    static bool done[MAX_N + 1][MAX_N / 2 + 2];
    static ll dp[MAX_N + 1][MAX_N / 2 + 2];  // 400MB
    if (n < 0 || r < 0 || n < r) return 0;
    if (r == 0) return 1;
    if (r > n - r) r = n - r;
    ll &res = dp[n][r];
    if (done[n][r]) return res;
    done[n][r] = true;
    return res = (nCr(n - 1, r - 1) + nCr(n - 1, r)) % mod;
}