介紹一種快速求 \(\dbinom{n}{m}\) 的方法。
其實就是根據定義來做的做法
我們知道 \(\dbinom{n}{m} \mod (1e9+7)=\frac{n\times (n-1)\times\dots\times(n-m+1)}{1\times 2\times\dots\times m} \mod (1e9+7)\)。
為方便表達,我們設 \(x=n\times (n-1)\times\dots\times(n-m+1)\) (即右邊的分子),\(y=1\times 2\times\dots\times m\) (即右邊的分母)。
然后就有
\[\dbinom{n}{m} \mod (1e9+7)=\frac{x}{y} \mod (1e9+7) \]
由費馬小定理得
\[y \times y^{(10^9+7)−2} \mod (10^9 + 7) = 1 \]
兩邊同時乘上 \(y^{-1}\) 得
\[y^{(10^9+7)-2} \mod (10^9+7)=y^{-1} \]
因為 \(y^{-1}\) 是 \(y\) 的逆元,所以就有
\[\frac{x}{y} \mod(10^9+7) = x \times y^{(10^9+7)-2} \mod (10^9+7) \]
代碼實現起來也不難。
inline LL qpow(LL a, LL b) //快速冪,用於求逆元
{
LL res = 1;
while (b)
{
if (b & 1) res = (res * a) % mod;
a = a * a % mod, b >>= 1;
}
return res % mod;
}
inline LL work(int n, int m) //求 C(n, m)
{
LL s = 1, c = 1;
for (int i = 1; i <= m; i+=1)
s = (s * i) %mod; //計算分母
for (int i = n - m + 1; i <= n; i++)
c = (c * i) % mod; //計算分子
return (c * qpow(s, mod - 2)) % mod; //求出值
}
P.S. 部分參考自 AtCoder Beginner Contest 156 D題題解