mod逆元を用いたCombination計算の証明

1. 用いる道具

1-1. モジュラ逆元

定義
モジュラ逆元xとは、
\ a,\ m \in \bf Zについて、ax \equiv 1(mod \ m)を満たす整数xであり
a^{-1} \equiv x(mod\ m)
と表記する。

2. Combinationの余り

 {}_n C_k = \frac{n!}{k!(n-k)!}\\
\Leftrightarrow k!(n-k)!{}_nC_k  =  n!\\
この式について p\in \bf Zを法とした合同式を書くと、

k!(n-k)!{}_nC_k  \equiv  n!\\
\Leftrightarrow ((k!)^{-1}k!)(n-k)!{}_nC_k \equiv n! (k!)^{-1}\\
\Leftrightarrow (n-k)!{}_nC_k \equiv n! (k!)^{-1}\\
\Leftrightarrow {}_nC_k \equiv n! (k!)^{-1}((n-k)!)^{-1}
合同式の積の結合法則を用いた。ここで、p素数のとき、上述した補題から
(k!)^{-1} \equiv (k!)^{p-2}
((n-k)!)^{-1} \equiv ((n-k)!)^{p-2}
を代入すると、

{}_nC_k \equiv n!(k!)^{p-2}((n-k)!)^{p-2} (mod\ p)
Permutationについても、同様にして、

{}_nP_k \equiv n!(k!)^{p-2}(mod\ p)

共に、n!までのpを法とする剰余を求めれば良いのでO(n)で計算可能。
10^9 + 7 \in prime\ numberなので、
p = 10^9 + 7, 入力nについてn < pの時はこの計算が可能。