Loading

「学习笔记」组合数学

本文部分内容来自 \(\texttt{OI-Wiki}\)


加法 & 乘法原理

加法原理

完成一个工程可以有 \(n\) 类办法,\(a_i(1 \le i \le n)\) 代表第 \(i\) 类方法的数目。那么完成这件事共有 \(S= a_1 + a_2 + \dots + a_n\) 种不同的方法。

乘法原理

完成一个工程需要分 \(n\) 个步骤,\(a_i(1 \le i \le n)\) 代表第 \(i\) 个步骤的不同方法数目。那么完成这件事共有 \(S = a_1 \times a_2 \times \dots \times a_n\) 种不同的方法。

排列与组合

排列

\(n\) 个不同元素中,任取 \(m\)\(m\leq n\)\(m\)\(n\) 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 \(n\) 个不同元素中取出 \(m\) 个元素的一个排列;从 \(n\) 个不同元素中取出 \(m(m\leq n)\) 个元素的所有排列的个数,叫做从 \(n\) 个不同元素中取出 \(m\) 个元素的排列数,用符号 \(\mathrm A_n^m\)(或者是 \(\mathrm P_n^m\))表示。

\[\mathrm A_n^m = n \cdot (n - 1) \cdot (n - 2) \dots (n - m + 1) = \dfrac{n!}{(n - m)!} \]

公式可以这样理解:\(n\) 个人选 \(m\) 个来排队 \((m \le n)\)。第一个位置可以选 \(n\) 个,第二位置可以选 \(n-1\) 个,以此类推,第 \(m\) 个(最后一个)可以选 \(n-m+1\) 个,得:

\[\mathrm A_n^m = n(n-1)(n-2) \dots (n-m+1) = \frac{n!}{(n - m)!} \]

全排列:\(n\) 个人全部来排队,队长为 \(n\)。第一个位置可以选 \(n\) 个,第二位置可以选 \(n-1\) 个,以此类推得:

\[\mathrm A_n^n = n(n-1)(n-2) \dots 3 \times 2 \times 1 = n! \]

全排列是排列数的一个特殊情况。

组合

\(n\) 个不同元素中,任取 \(m \leq n\) 个元素组成一个集合(不是排列),叫做从 \(n\) 个不同元素中取出 \(m\) 个元素的一个组合;从 \(n\) 个不同元素中取出 \(m \leq n\) 个元素的所有组合的个数,叫做从 \(n\) 个不同元素中取出 \(m\) 个元素的组合数,用符号 \(\dbinom{n}{m}\) 来表示,读作「\(n\)\(m\)」。

组合数计算公式

\[\dbinom{n}{m} = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n - m)!} \]

如何理解上述公式?我们考虑 \(n\) 个人选 \(m\) 个出来(\(m \le n\)),不排队,不在乎顺序。如果在乎顺序那么就是
\(\mathrm A_n^m\),如果不在乎那么就要除掉重复,那么重复了多少?同样选出来的 \(m\) 个人,他们还要「全排」得 \(m!\)

组合数也常用 \(\mathrm C_n^m\) 表示,即 \(\mathrm C_n^m=\dbinom{n}{m}\)。现在数学界普遍采用 \(\dbinom{n}{m}\) 的记号而非 \(\mathrm C_n^m\)

特别地,规定当 \(m>n\) 时,\(\mathrm A_n^m=\dbinom{n}{m}=0\)

关于组合数的一些公式

\[\dbinom{n}{0} = \dbinom{n}{n} = 1\\ \]

这个应该很好理解,不选和全选的方式就只有一种情况。


\[\dbinom{n}{m} = \dbinom{n}{n - m}\\ \]

这个公式可以这么理解,你在 \(n\) 个人中选走了 \(m\) 个人,另一个人把剩下的 \(n - m\) 个人给选走了,对你来说,你选人的方案数为 \(\dbinom{n}{m}\),而另一个人选人的方案数与我们是一样的,换位思考一下,倘若主动权在另一个人手中,则他选人的方案数就是 \(\dbinom{n}{n - m}\),方案数不变,两者是等价的,故得 \(\dbinom{n}{m} = \dbinom{n}{n - m}\)


\[\dbinom{n}{m} = \dbinom{n - 1}{m - 1} + \dbinom{n - 1}{m} \]

这个公式可以这么理解,对于从 \(n\) 个人中选 \(m\) 个人的方案数,可以分第一个人选或不选两种方案,如果第一个人选,则方案数为 \(\dbinom{n - 1}{m - 1}\),如果第一个人不选,则方案数为 \(\dbinom{n - 1}{m}\),加起来即为 \(\dbinom{n}{m}\)

由此,我们可以得到组合数的递推公式,下面是递推求组合数的代码。

for (int i = 0; i <= n; ++ i) {
    C[i][0] = 1;
    for (int j = 1; j <= i; ++ j) {
        C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
    }
}

\[\dbinom{k}{1} + \dbinom{k}{2} + \dbinom{k}{3} + \cdots + \dbinom{k}{k} = 2^k - 1 \]

对于 \(k\) 个数,每个数都有选或不选两种情况,总共有 \(2^k\) 种情况,上面的公式包括了除了每个数都不选这 \(1\) 种情况外的所有情况,因此情况数为 \(2^k - 1\)

同时可得到另一个公式:

\[\dbinom{k}{0} + \dbinom{k}{1} + \dbinom{k}{2} + \dbinom{k}{3} + \cdots + \dbinom{k}{k} = 2^k \]

还有一些别的:

\[\sum_{i = 0}^{m} \dbinom{n}{i} \dbinom{m}{m - i} = \dbinom{m + n}{m} (n \ge m)\\ \sum_{i=0}^n \dbinom{n}{i}^2 = \dbinom{2n}{n} \]

插板法

现在有 \(n\) 个完全相同的元素,要求将其分成 \(k\) 组,保证每组不为空,一共有多少种分法?

考虑在这 \(n\) 个元素形成的 \(n - 1\) 个空中插入 \(k - 1\) 个板将他们隔开,分成 \(k\) 组。

答案:\(\dbinom{n - 1}{k - 1}\)

本质是求 \(x_1 + x_2 + x_3 + \dots + x_k = n\) 的正整数解的组数

现在允许可以有为空的组,其余条件与上题一样

考虑借来 \(k\) 个元素,这 \(k\) 个元素分别放入 \(k\) 组,最后分好 \(k\) 组后再将这 \(k\) 个元素删掉,这样就转化成了上面的问题,将这 \(n + k\) 个元素分成 \(k\) 组,每组不能为空,公式:

\[\dbinom{n + k - 1}{k - 1} = \dbinom{n + k - 1}{n} \]

现在每组中都有限制,第 \(i\) 组内的元素个数要求不少于 \(a_i\) 个,保证 \(\sum_{i = 1}^{k} a_i \le n\)

考虑先将这 \(\sum_{i = 1}^{k} a_i\) 个元素,按照要求分在各个组里,现在还剩下 \(n - \sum_{i = 1}^{k} a_i\) 个元素,转化成上面的问题,将这 \(n - \sum_{i = 1}^{k} a_i\) 个元素分到 \(k\) 组里,可以有为空的组,公式:

\[\dbinom{n - \sum_{i=1}^{k} a_i + k - 1}{k - 1} = \dbinom{n - \sum_{i=1}^{k} a_i + k - 1}{n - \sum_{i = 1}^{k} a_i} \]

\(1 \sim n\)\(n\) 个自然数中,选出 \(k\) 个不相邻的数的方案数。

考虑选出 \(n - k\) 个位置,这样就产生了 \(n - k + 1\) 个空,将 \(k\) 个元素插入到这些空中,最后从前往后依次标号即可,方案数:

\[\dbinom{n - k + 1}{k} \]

多重集

有重复元素的广义集合。设 \(S = \left \{ n_1 \cdot a_1, n_2 \cdot a_2, n_3 \cdot a_3, \dots, n_k \cdot a_k \right \}\) 表示由 \(n_1\)\(a_1\)\(n_2\)\(a_2\)\(n_3\)\(a_3\) …… \(n_k\)\(a_k\) 组成的多重集。

多重集的排列

\(n = n_1 + n_2 + n_3 + \dots + n_k\),所有元素总的排列为 \(n!\),除去相同元素的排列 \(\prod_{i = 1}^{k} n_i = n_1! \cdot n_2! \cdot n_3! \dots n_k!\),最后的全排列公式为:

\[\dfrac{n!}{\prod_{i = 1}^{k} n_i} = \dfrac{n!}{n_1! \cdot n_2! \cdot n_3! \dots n_k!} \]

具体地,你可以认为你有 \(k\) 种不一样的球,每种球的个数分别是 \(n_1,n_2,\ldots,n_k\),且 \(n=n_1+n_2+\ldots+n_k\)。这 \(n\) 个球的全排列数就是 多重集的排列数。多重集的排列数常被称作 多重组合数

多重组合数符号 \(\dbinom{n}{n_1, n_2, n_3, \ldots, n_k} = \dfrac{n!}{n_1! \cdot n_2! \cdot n_3! \ldots n_k!} = \dfrac{n!}{\prod_{i = 1}^{k} n_i}\)

多重集的组合

\(S= \left \{n_1\cdot a_1,n_2\cdot a_2,\dots,n_k \cdot a_k \right \}\) 表示由 \(n_1\)\(a_1\)\(n_2\)\(a_2\),…,\(n_k\)\(a_k\) 组成的多重集。那么对于整数 \(r(r < n_i,\forall i \in \left [1,k \right ])\),从 \(S\) 中选择 \(r\) 个元素组成一个多重集的方案数就是 多重集的组合数。这个问题等价于 \(x_1+x_2+\ldots+x_k = r\) 的非负整数解的数目,可以用插板法解决,参考上面插板法的问题二,公式:

\[\dbinom{r + k - 1}{k - 1} \]

上面对于 \(r\) 的限制是 \(r(r < n_i,\forall i \in \left [1,k \right ])\),现在对于 \(r\) 的限制是 \(r \le \sum_{i = 1}^{k}n_k\),这里要用容斥,最后的结果是:

\[Ans=\sum_{p=0}^k(-1)^p\sum_{A}\binom{k+r-1-\sum_{A} n_{A_i}-p}{k-1} \]

其中 \(A\) 是充当枚举子集的作用,满足 \(|A|=p,\ A_i<A_{i+1}\)

圆排列

\(n\) 个人全部来围成一圈,所有的排列数记为 \(\mathrm Q_n^n\)。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有

\[\mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)! \]

由此可知部分圆排列的公式:

\[\mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!} \]

二项式定理

之前写了:「学习笔记」从二项式定理到多项式定理

抽屉原理(鸽巢原理)

现在有 \(n + 1\) 个东西,放到 \(n\) 个抽屉里面去,那么肯定有一个抽屉放了 \(2\) 个东西。

不信你自己试试看。

让我们扩展一下:现在要把 \(k \cdot n + 1\) 个东西放到 \(n\) 个抽屉中去,则至少有 \(1\) 个抽屉至少有 \(k + 1\) 个东西。

定理很简单,这类题目真正难的地方在于你要能看出它是抽屉原理,要知道谁是抽屉,谁是东西。

容斥原理

之前写了:「学习笔记」容斥原理

错位排列

错位排列(derangement)是没有任何元素出现在其有序位置的排列。即,对于 \(1\sim n\) 的排列 \(P\),如果满足 \(P_i \neq i\),则称 \(P\)\(n\) 的错位排列。

把错位排列问题具体化,考虑这样一个问题:

\(n\) 封不同的信,编号分别是 \(1,2,3,4,5\),现在要把这五封信放在编号 \(1,2,3,4,5\) 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法?
假设考虑到第 \(n\) 个信封,初始时暂时把第 \(n\) 封信放在第 \(n\) 个信封中,然后考虑两种情况的递推:

  • 前面 \(n-1\) 个信封全部装错;

  • 前面 \(n-1\) 个信封有一个没有装错其余全部装错。

对于第一种情况,前面 \(n-1\) 个信封全部装错:因为前面 \(n-1\) 个已经全部装错了,所以第 \(n\) 封只需要与前面任意一个位置交换即可,总共有 \(D_{n-1}\times (n-1)\) 种情况。
对于第二种情况,前面 \(n-1\) 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 \(n-1\) 个信封中如果有一个没装错,那么把那个没装错的与 \(n\) 交换,即可得到一个全错位排列情况。
其他情况,不可能通过一次操作来把它变成一个长度为 \(n\) 的错排。
于是可得,错位排列数满足递推关系:

\[D_n=(n-1)(D_{n-1}+D_{n-2}) \]

斯特林数

第二类斯特林数

第二类斯特林数(斯特林子集数) \(\begin{Bmatrix} n\\ k \end{Bmatrix}\),也可记做 \(S(n,k)\),表示将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空子集的方案数。
递推式:

\[\begin{Bmatrix}n\\ k\end{Bmatrix}=\begin{Bmatrix}n-1\\ k-1\end{Bmatrix}+k\begin{Bmatrix}n-1\\ k\end{Bmatrix} \]

边界是 \(\begin{Bmatrix}n\\ 0\end{Bmatrix}=[n=0]\)

考虑用组合意义来证明。

我们插入一个新元素时,有两种方案:
将新元素单独放入一个子集,有 \(\begin{Bmatrix}n-1\\ k-1\end{Bmatrix}\) 种方案;

将新元素放入一个现有的非空子集,有 \(k\begin{Bmatrix}n-1\\ k\end{Bmatrix}\) 种方案。

根据加法原理,将两式相加即可得到递推式。

第一类斯特林数

第一类斯特林数(斯特林轮换数)\(\begin{bmatrix}n\\ k\end{bmatrix}\),也可记做 \(s(n,k)\),表示将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空轮换的方案数。

一个轮换就是一个首尾相接的环形排列。我们可以写出一个轮换 \([A,B,C,D]\),并且我们认为 \([A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C]\),即,两个可以通过旋转而互相得到的轮换是等价的。注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即 \([A,B,C,D]\neq[D,C,B,A]\)

递推式:

\[\begin{bmatrix}n\\ k\end{bmatrix}=\begin{bmatrix}n-1\\ k-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\ k\end{bmatrix} \]

边界是 \(\begin{bmatrix}n\\ 0\end{bmatrix}=[n=0]\)

该递推式的证明可以考虑其组合意义。
我们插入一个新元素时,有两种方案:

  • 将该新元素置于一个单独的轮换中,共有 \(\begin{bmatrix}n-1\\ k-1\end{bmatrix}\) 种方案;

  • 将该元素插入到任何一个现有的轮换中,共有 \((n-1)\begin{bmatrix}n-1\\ k\end{bmatrix}\) 种方案。

根据加法原理,将两式相加即可得到递推式。

组合数的题目

\(n\) 个数,\(1, 2, 3, 4, 5, 6, \dots\),选 \(m\) 个数,不计顺序,一个数可以选多次,求方案数。

假设选出的数是 \(a_1, a_2, a_3, \dots, a_m\),这 \(m\) 个数不能重复,且递增选出。方案数:\(\dbinom{n}{m}\)
这是我们所知道的,\(a \le a_1 < a_2 < a_3 < \dots < a_m \le n\)

但是,对于这个题来说,情况是 \(1 \le b_1 \le b_2 \le b_3 \le \dots \le b_m \le n\),因此我们需要转化过去,即

\[a \le a_1 < a_2 < a_3 < \dots < a_m \le n\\ \Uparrow\\ 1 \le b_1 \le b_2 \le b_3 \le \dots \le b_m \le n\\ \]

考虑构造,\(C_1 = b_1, C_2 = b_2 + 1, C_3 = b_3 + 2, \dots , C_m = b_m + m - 1\)

那么,\(1 \le b_1 \le b_2 \le b_3 \le \cdots \le b_m \le n\) 就转化为了 \(1 \le C_1 < C_2 < C_3 \cdots < C_m \le n + m - 1\)

我们的方案数也呼之欲出了:\(\dbinom{n + m - 1}{m}\)

posted @ 2023-08-30 19:20  yi_fan0305  阅读(84)  评论(0编辑  收藏  举报