【數學】組合數學與計數

文章相關

寫在前面

感謝 caq 的奇奇怪怪的組合數學筆記,實在看不下去了!html

文中如無特殊說明,只有在出現 \(A_{n}^{m}\) 的式子中,組合數才使用 \(C_{n}^{m}\),其他一概用 \(\dbinom{n}{m}\)spa

updates

暫無htm

概念

計算式會在正文給出。blog

排列

\(n\) 個數中選擇 \(m\) 個數,與排列順序有關的方案數被稱爲 \(n\) 排列 \(m\),記做 \(A_{n}^{m}\)get

全排列

特別的,當 \(n = m\) 時,\(A_{n}^{m}\),被稱爲 \(n\)\(m\)全排列數學

組合

\(n\) 個數中選擇 \(m\) 個數,只與選擇的數有關的方案數被稱爲 \(n\)\(m\),記做 \(\dbinom{n}{m}\)\(C_{n}^{m}\)class

實際應用中,組合的應用範圍遠遠比排列要廣。排列常常只被使用全排列這一種形式來輔助組合的計算。date

正文

計算式

組合:方法

\[\binom{n}{m} = \frac{n!}{m!(n - m)!} \]

排列:im

\[A_{n}^{m} = \frac{n!}{(n - m)!} \]

所以那麼顯然有:

全排列:

\[A_{n}^{n} = n! \]

排列與組合的關係:

\[A_{n}^{m} = C_{n}^{m} \times A_{m}^{m} \]

接下來咱們把目光重點放在組合上。

組合數計算式

計算式

下面提供四種計算組合數的計算式。

\[\binom{n}{m} = \frac{n!}{m!(n - m)!}\tag{1} \]

\[\binom{n}{m} = \binom{n - 1}{m - 1} + \binom{n - 1}{m}\tag{2} \]

\[\binom{n}{m} = \frac{n}{m}\binom{n - 1}{m - 1}\tag{3} \]

\[\binom{n}{m} \bmod p = \binom{n \bmod p}{m \bmod p}\binom{\lfloor\dfrac{n}{p}\rfloor}{\lfloor\dfrac{m}{p}\rfloor} \bmod p(p \in \mathbb P)(\text{Lucas 定理})\tag{4} \]

證實

待填。

實現

第一個,預處理出階乘便可。

若是要求在取模意義下,分母部分能夠預處理階乘的逆元。

預處理時,只需計算出最大可能的 \(n\) 的階乘的逆元,而後倒推便可。

複雜度是 \(O(n)\) 的,通常用於計算 \(n, m \le 10^6\) 範圍內的組合數,是頗有用的組合數計算方式。

具體實現能夠參考個人 這篇題解

同時,這個方法也能夠用來預處理一整個數列的乘法逆元。不難推導,讀者能夠自行思考一下。

第二個,是組合數的遞推式。

若是把組合數的 \(n,m\) 較小的答案算出來,不難發現就是個「楊輝三角」。

所以就能夠遞推了。

這個方法的時空複雜度都是 \(\mathcal O(n^2)\) 的,不如第一個優秀,這種方法能實現的,第一種方法都能代替。

第三個,是組合數的另外一種計算式。

這種方法把直接用組合數計算式 \(\dfrac{n!}{m!(n - m)!}\) 分子中的 \(n!\)、分母中的 \(m!\) 拆開來,成爲:

\[\dfrac{n}{m}\cdot\dfrac{(n - 1)!}{(m - 1)![(n - 1) - (m - 1)]!} \]

\[\dfrac{n}{m}\dbinom{n - 1}{m - 1} \]

咱們知道,當 \(m = 0\) 時,不管 \(n\) 爲什麼值, \(\dbinom{n}{m}\) 恆爲 \(1\)

所以,這種方法能夠一直迭代下去,直到表示到 \(m = 1\)

經常使用於 \(n\) 巨大(通常在 \(10^9\) 級別),而 \(m\) 較小(通常在 \(10^5\) 級別)的時候組合數的計算。

實現時能夠預處理 \(1\)\(m\) 的逆元。

第四種,待填。

相關文章
相關標籤/搜索