#CP nCk % MODの計算

夏休みもいよいよ後半にさしかかろうというところ、ようやく重い腰を上げて競プロを再開したいと思います。でもたぶん数日でまた飽きて競プロをミュートワードにするかもしれません。

今回はCombination(nCkとかのやつ)のMODをテンプレ化しておこうと思います。特に競プロでありがちなnCk % MOD(だいたい10**9+7)です。
python combination mod」で検索するといろいろ出てきますが、グローバル変数を用意しなくてはならなかったりしてこれ1つコピペすれば完璧!!みたいなのがなかったので変なところに美意識を発揮しがちなオタク的には許せませんでした。なので1つのクラスをコピペすればいいように書きました。なお、完全に競プロ目的で書いたので汎用性はないです。(一度MODを決めたら後から変更はできません)
理論とかは他のサイト様を参照してください。今回はこちらのサイト様を参考にさせていただきました。

keita-matsushita.hatenablog.com


実装例

class comb():
    MOD = 10**9+7
    factrial = [1] # 階乗を保持
    inverse = [1] # 逆元を保持
    
    @staticmethod
    def calc(n, k): # nCk % MODを計算
        comb.pre(n) # 前処理
        ans = comb.factrial[n]*comb.inverse[k]%comb.MOD*comb.inverse[n-k]%comb.MOD
        return ans
    
    @staticmethod
    def pre(n):
        if n <= len(comb.factrial)-1: # nまで計算済み
            return
        else: # それ以外は要計算
            while len(comb.factrial)-1 != n:
                tmp1 = comb.factrial[-1]*len(comb.factrial)%comb.MOD
                comb.factrial.append(tmp1)
                tmp2 = pow(comb.factrial[-1], comb.MOD-2, comb.MOD)
                comb.inverse.append(tmp2)
            return


使用例
クラス定義部分は省略しています

# 5C2 = 10
print(comb.calc(5,2))

# 10C3 = 120
print(comb.calc(10,3))

実行結果

10
120