【数学】组合数学与计数

文章相关

写在前面

感谢 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\) 的逆元。

第四种,待填。

相关文章
相关标签/搜索