一種快速求組合數的方法


介紹一種快速求 \(\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題題解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM