Combination

概略

Combinationに係る諸計算のライブラリ

目次

アルゴリズム

逆元

$$ {}_{n} \mathrm{C} _ {r} = \frac{n!}{r!(n-r)!} $$ なので分数のmodを求めたい気持ちになる.ここで逆元を使う.

整数 $a$ と 素数 $p$ について $$ p = \left\lfloor \frac{p}{a} \right\rfloor \times a + p\%a $$ mod $p$ とすると $$ 0 \equiv \left\lfloor \frac{p}{a} \right\rfloor \times a + p\%a $$ $$ p\%a \equiv - \left\lfloor \frac{p}{a} \right\rfloor \times a $$ $$ p\%a \times a^{-1} \equiv - \left\lfloor \frac{p}{a} \right\rfloor $$ $$ a^{-1} \equiv - \left\lfloor \frac{p}{a} \right\rfloor \times (p\%a)^{-1} $$

ここで $p\%a < a$ であるから,小さい方から漸化的に求められる.

なお,$0^{-1}$ の値は未定義なので,最終的な式において $p\%a \neq 0$ でなければならない.そのため $p$ は素数である.(正確には $p$ と $a$ が互いに素)

パスカルの三角形

$$ \begin{cases} {}_{n} \mathrm{C} _ {r} = {}_{n-1} \mathrm{C} _ {r-1} + {}_{n-1} \mathrm{C} _ {r} \\ {}_{n} \mathrm{C} _ {0} = {}_{n} \mathrm{C} _ {n} = 1 \end{cases} $$

より漸化的に求められる.

実装例

逆元

$n,r \leq 10^6 $ 程度を想定している.$p$ は素数.

[展開する]

パスカルの三角形

$n,r \leq 10^3 $ 程度を想定している.$p$ は素数でなくてもよい.

[展開する]

verify

AOJ1501 Grid — AIZU ONLINE JUDGE

mod 1,000,000,007 だと思っていたら~、
mod 100,000,007 でした~。
チクショー!!
[展開する]

No.117 組み合わせの数 — yukicoder

[展開する]

D - 多重ループ - AtCoder Beginner Contest 021 — AtCoder

[展開する]

参考