Loading docs/math/combination.md +185 −82 Original line number Diff line number Diff line ## 排列组合简介 排列组合是组合数学中的一种。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。 排列组合是组合数学中的基础。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。 在高中初等数学中,排列组合多是利用列表、枚举等方法解题。 * * * ## 排列组合公式及定义 ## 加法 & 乘法原理 ### 加法原理 完成一个工程可以有 $n$ 类办法, $a_i(1 \le i \le n)$ 代表第 $i$ 类方法的数目。那么完成这件事共有 $S=a_1+a_2+\cdots +a_n$ 种不同的方法。 ### 排列的定义 ### 乘法原理 完成一个工程需要分 $n$ 个步骤, $a_i(1 \le i \le n)$ 代表第 $i$ 个步骤的不同方法数目。那么完成这件事共有 $S = a_1 \times a_2 \times \cdots \times a_n$ 种不同的方法。 ## 排列与组合基础 从 $n$ 个不同元素中,任取 $m$ ( $m\leqslant n$ , $m$ 与 $n$ 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个排列;从 $n$ 个不同元素中取出 $m$ ( $m\leqslant n$ ) 个元素的所有排列的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的排列数,用符号 $A_n^m$ (或者是 $P_n^m$ )表示。 ### 排列数 ### 排列的计算公式 从 $n$ 个不同元素中,任取 $m$ ( $m\leq n$ , $m$ 与 $n$ 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个排列;从 $n$ 个不同元素中取出 $m$ ( $m\leq n$ ) 个元素的所有排列的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的排列数,用符号 $\mathrm A_n^m$ (或者是 $\mathrm P_n^m$ )表示。 排列的计算公式如下: $$ A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} $$ ** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ .** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ 。 ### 组合的定义 公式可以这样理解: $n$ 个人选 $m$ 个来排队 ( $m \le n$ )。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推,第 $m$ 个(最后一个)可以选 $n-m+1$ 个,得: 从 $n$ 个不同元素中,任取 $m$ ( $m\leqslant n$ ) 个元素组成一个集合,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个组合;从 $n$ 个不同元素中取出 $m$ ( $m≤n$ ) 个元素的所有组合的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的组合数。用符号 $C_n^m$ (或者是 $\binom{m}{n}$ )表示。 $$ \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} $$ ### 组合的计算公式 全排列: $n$ 个人全部来排队,队长为 $n$ 。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推得: $$ C_n^m = \frac{A_n^m}{m!} = \frac{n!}{m!(n - m)!} \mathrm A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n! $$ ## 排列组合的分类 全排列是排列数的一个特殊情况。 ### 组合数 ### 排列 从 $n$ 个不同元素中,任取 $m$ ( $m\leq n$ ) 个元素组成一个集合,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个组合;从 $n$ 个不同元素中取出 $m$ ( $m\leq n$ ) 个元素的所有组合的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的组合数。用符号 $\mathrm C_n^m$ 来表示。 **全排列** : $n$ 个人全部来排队,队长为 $n$ 。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推得: 组合数计算公式 $$ A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n! \mathrm C_n^m = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n - m)!} $$ **部分排列** : $n$ 个人选 $m$ 个来排队 ( $m \le n$ )。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推,第 $m$ 个(最后一个)可以选 $n-m+1$ 个,得: 如何理解上述公式?我们考虑 $n$ 个人 $m$ ( $m \le n$ ) 个出来,不排队,不在乎顺序 $C_n^m$ 。如果在乎排列那么就是 $A_n^m$ ,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 $m$ 个人,他们还要“全排”得 $A_n^m$ ,所以得: $$ A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} \mathrm C_n^m \times m! = \mathrm A_n^m\\ \mathrm C_n^m = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n-m)!} $$ ### 组合 组合数也常用 $\displaystyle \binom{n}{m}$ 表示,读作「 $n$ 选 $m$ 」,即 $\displaystyle \mathrm C_n^m=\binom{n}{m}$ 。实际上,后者表意清晰明了,美观简洁,因此现在数学界普遍采用 $\displaystyle \binom{n}{m}$ 的记号而非 $\mathrm C_n^m$ 。 $n$ 个人 $m$ ( $m \le n$ ) 个出来,不排队,不在乎顺序 $C_n^m$ 。如果在乎排列那么就是 $A_n^m$ ,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 $m$ 个人,他们还要“全排”得 $A_n^m$ ,所以得: 组合数也被称为「二项式系数」,下文二项式定理将会阐述其中的联系。 $$ C_n^m \times m! = A_n^m $$ 特别地,规定当 $m>n$ 时, $\mathrm A_n^m=\mathrm C_n^m=0$ 。 ## 二项式定理 在进入排列组合进阶篇之前,我们先介绍一个与组合数密切相关的定理——二项式定理。 二项式定理阐明了一个展开式的系数: $$ C_n^m = \frac{A_n^m}{m!} = \frac{n!}{m!(n-m)!} (a+b)^n=\sum_{i=0}^n\binom{n}{i}a^{n-i}b^i $$ #### 组合数的性质 证明可以采用数学归纳法,利用 $\displaystyle \binom{n}{k}+\binom{n}{k-1}=\binom{n+1}{k}$ 做归纳。 二项式定理也可以很容易扩展为多项式的形式: 设 n 为正整数, $x_i$ 为实数, $$ C_n^m = C_{n}^{n-m} (x_1 + x_2 + \cdots + x_t)^n = \sum_{满足 n_1 + \cdots + n_t=n 的非负整数解} \binom{n}{n_1n_2\cdots n_t} x_1^{n_1}x_2^{n_2}\cdots x_t^{n_t} $$ 相当于将选出的集合对全集取补集,故数值不变。 其中的 $\binom{n}{n_1n_2\cdots n_t}$ 是多项式系数,它的性质也很相似: $$ C_n^m = C_{n-1}^{m} + C_{n-1}^{m-1} \sum{\binom{n}{n_1n_2\cdots n_t}} = t^n $$ 杨辉三角的公式表达。思考一下怎么利用这个式子,在 $O(n^2)$ 的复杂度下推导组合数? ## 排列与组合进阶篇 ### 圆排列 接下来我们介绍一些排列组合的变种。 ### 多重集的排列数 | 多重组合数 请大家一定要区分 **多重组合数** 与 **多重集的组合数** !两者是完全不同的概念! $n$ 个人全部来围成一圈为 $Q_n^n$ ,其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以: 多重集是指包含重复元素的广义集合。设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集, $S$ 的全排列个数为 $$ Q_n^n \times n = A_n^n → Q_n = \frac{A_n^n}{n} = (n-1)! \frac{n!}{\prod_{i=1}^kn_i!}=\frac{n!}{n_1!n_2!\cdots n_k!} $$ 由此可知部分圆排列的公式: 相当于把相同元素的排列数除掉了。具体地,你可以认为你有 $k$ 种不一样的球,每种球的个数分别是 $n_1,n_2,\cdots,n_k$ ,且 $n=n_1+n_2+\ldots+n_k$ 。这 $n$ 个球的全排列数就是 **多重集的排列数** 。多重集的排列数常被称作 **多重组合数** 。我们可以用多重组合数的符号表示上式: $$ Q_n^r = \frac{A_n^r}{r} = \frac{n!}{r \times (n-r)!} \binom{n}{n_1,n_2,\cdots,n_k}=\frac{n!}{\prod_{i=1}^kn_i!} $$ ### 重复排列(有限) 可以看出, $\displaystyle \binom{n}{m}$ 等价于 $\displaystyle \binom{n}{m,n-m}$ ,只不过后者较为繁琐,因而不采用。 ### 多重集的组合数 1 $k$ 种不一样的球,每种球的个数分别是 $a_1,a_2,\cdots,a_k$ ,设 $n=a_1+a_2+\ldots+a_k$ ,这 $n$ 个球的全排列数,为 设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集。那么对于整数 $r(r<n_i,\forall i\in[1,k])$ ,从 $S$ 中选择 $r$ 个元素组成一个多重集的方案数就是 **多重集的组合数** 。这个问题等价于 $x_1+x_2+\cdots+x_k=r$ 的非负整数解的数目,可以用插板法解决,答案为 $$ \frac{n!}{a_1! \times a_2! \times \cdots \times a_k!} \binom{r+k-1}{k-1} $$ ### 重复组合(无限) ### 多重集的组合数 2 考虑这个问题:设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集。那么对于正整数 $r$ ,从 $S$ 中选择 $r$ 个元素组成一个多重集的方案数。 这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解: $$ \forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r $$ $n$ 种不一样的球,每种球的个数是无限的,从中选 $k$ 个出来,不用排列,是组合,为 $C_{n+k-1}^{k}$ . 于是很自然地想到了容斥原理。容斥的模型如下: 证明: 1. 全集: $\displaystyle \sum_{i=1}^kx_i=r$ 的非负整数解。 2. 属性: $x_i\le n_i$ 。 > 假设选出来的数(排好序): 于是设满足属性 $i$ 的集合是 $S_i$ , $\overline{S_i}$ 表示不满足属性 $i$ 的集合,即满足 $x_i\ge n_i+1$ 的集合。那么答案即为 $$ 1 \le b_1 \le b_2 \le b_3 \le \cdots \le b_k \le n \left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right| $$ > 这题的难点就是 $=$ 号,现在去掉 $=$ 号,所以有: 根据容斥原理,有: $$ 1 \le b_1 < b_2+1 < b_3+2 < b_4+3 < \cdots < b_k+k-1 \le n+k-1 \begin{split} \left|\bigcup_{i=1}^k\overline{S_i}\right| &=&\sum_i\left|\overline{S_i}\right| -\sum_{i,j}\left|\overline{S_i}\cap\overline{S_j}\right| +\sum_{i,j,k}\left|\overline{S_i}\cap\overline{S_j}\cap\overline{S_k}\right| -\cdots\\ &&+(-1)^{k-1}\left|\bigcap_{i=1}^k\overline{S_i}\right|\\ &=&\sum_i\binom{k+r-n_i-2}{k-1} -\sum_{i,j}\binom{k+r-n_i-n_j-3}{k-1}+\sum_{i,j,k}\binom{k+r-n_i-n_j-n_k-4}{k-1} -\cdots\\ &&+(-1)^{k-1}\binom{k+r-\sum_{i=1}^kn_i-k-1}{k-1} \end{split} $$ 中间还是 $k$ 个数!不过已经不是 $b$ 系列,而是 $c$ 系列, **假设 $c[i]=b[i]+i-1$ ,所以** 拿全集 $\displaystyle |U|=\binom{k+r-1}{k-1}$ 减去上式,得到多重集的组合数 $$ 1 \le c_1 < c_2 < c_3 < c_4 < \cdots < c_k \le n+k-1 Ans=\sum_{p=0}^k(-1)^p\sum_{A}\binom{k+r-1-\sum_{A} n_{A_i}-p}{k-1} $$ 所以问题就开始转换为无重复组合问题,即在 $n+k-1$ 个元素中选中 $k$ 个的组合数 $C_{n+k-1}^{k}$ 。 其中 A 是充当枚举子集的作用,满足 $|A|=p,\ A_i<A_{i+1}$ 。 ### 不相邻的排列 $1 \sim n$ 这 $n$ 个自然数中选 $k$ 个,这 $k$ 个数中任何两个数不相邻数的组合有 $C_{n-k+1}^{k}$ 种。 证明和上面的相同(其实就是懒得写),请自行证明 XD $1 \sim n$ 这 $n$ 个自然数中选 $k$ 个,这 $k$ 个数中任何两个数不相邻数的组合有 $\displaystyle \binom {n-k+1}{k}$ 种。 ### 错位排列(错排) ### 错位排列 先看一个小问题: $5$ 本书,编号分别是 $1,2,3,4,5$ ,现在要把这 5 本书是放在编号 $1,2,3,4,5$ 的书架上,要求书的编号和书架的编号不一样,请问有多少种不一样的放置方法? 我们把错位排列问题具体化,考虑这样一个问题: 再看一个小问题: 胸口贴着编号为 $1,2,\cdots,n$ 的 $n$ 个球员分别住在编号为 $1,2,\cdots,n$ 的 $n$ 个房间里面。现规定每个人住一个房间,自己的编号不能和房间的编号一样。 $n$ 封不同的信,编号分别是 $1,2,3,4,5$ ,现在要把这 5 封信放在编号 $1,2,3,4,5$ 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法? 这就是错排问题。当 $n=3$ 时,只能为 312 或 231 这两种。 假设我们考虑到第 $n$ 个信封,初始时我们暂时把第 n 封信放在第 n 个信封中,然后考虑两种情况的递推: 那么错排问题的解题思路是什么呢?我们以第二个问题为例: **递推还是王道!** - 前面 $n-1$ 个信封全部装错; - 前面 $n-1$ 个信封有一个没有装错其余全部装错。 刚开始所有球员都住在和自己编号一样的房间里面。然后错排开始了,第 $n$ 个球员从第 $n$ 个房间出来。 对于第一种情况,前面 $n-1$ 个信封全部装错:因为前面 $n-1$ 个已经全部装错了,所以第 n 封只需要与前面任一一个位置交换即可,总共有 $f(n-1)\times (n-1)$ 种情况。 第一种情况: $n$ 想和 $i(1 \le i \le n-1)$ 其中任何一个球员换房间,其他 $n-2$ 个人换房间的事情,他们就不管了。其他 $n-2$ 个球员的的错排数为 $d[n-2]$ , $n$ 可以和前面 $1 \sim n-1$ 对换,所以有 $n-1$ 个 $d[n-2]$ 。 对于第二种情况,前面 $n-1$ 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 $n-1$ 个信封中如果有一个没装错,那么我们把那个没装错的与 $n$ 交换,即可得到一个全错位排列情况。 第二种情况: $n$ 想和 $i(1 \le i \le n-1)$ 其中任何一个球员换房间,但是 $n$ 只想 $i$ 住在第 $N$ 个房间,而 $n$ 不想住第 $I$ 个房间。 其他情况,我们不可能通过一次操作来把它变成一个长度为 n 的错排。 可能你会这样想:那么 $n$ 可以让 $j$ 住在第 $I$ 号房间里面,然后 $n$ 住在房间 $J$ 。抱歉, $j(1 \le j \le n-1,j\neq i)$ 生气 $n$ 为什么一开始就去找 $i$ 不直接来找 $j$ 。没办法, $n$ 把自己胸口的编码 $N$ 换成了 $I$ ,他假装自己是 $i$ ,然后错排 $1 \sim n-1$ (也就是 $d[n-2]$ )的时候参与进去,这样自己就不会呆在第 $I$ 号房间了。所以有 $n-1$ 个 $d[n-1]$ 。 于是可得错位排列的递推式为 $f(n)=(n-1)(f(n-1)+f(n-2))$ 。 如果理解了以上内容,那么错排的公式就出来了: 错位排列数列的前几项为 $0,1,2,9,44,265$ 。 ### 圆排列 $n$ 个人全部来围成一圈,所有的排列数记为 $\mathrm Q_n^n$ 。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有 $$ d_n = (n-1)(d_{n-2} + d_{n-1}) (n\geq 3) \mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)! $$ 同时也有: 由此可知部分圆排列的公式: $$ d_n = n \times d_{n-1} + (-1)^n \mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!} $$ 错位排列数列为 $0,1,2,9,44,265,\cdots$ ## 组合数性质 | 二项式推论 ## 加法 & 乘法原理 由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。 ### 加法原理 $$ \binom{n}{m}=\binom{n}{n-m}\tag{1} $$ 完成一个工程可以有 $n$ 类办法, $a[i](1 \le i \le n)$ 代表第 $i$ 类方法的数目。 那么完成这件事共有 $S=a[1]+a[2]+\cdots +a[n]$ 种不同的方法。 相当于将选出的集合对全集取补集,故数值不变。(对称性) ### 乘法原理 $$ \binom{n}{k} = \frac{n}{k} \binom{n-1}{k-1}\tag{2} $$ 由定义导出的递推式。 $$ \binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\tag{3} $$ 组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在 $O(n^2)$ 的复杂度下推导组合数。 $$ \binom{n}{0}+\binom{n}{1}+\cdots+\binom{n}{n}=\sum_{i=0}^n\binom{n}{i}=2^n\tag{4} $$ 这是二项式定理的特殊情况。取 $a=b=1$ 就得到上式。 $$ \sum_{i=0}^n(-1)^i\binom{n}{i}=0\tag{5} $$ 二项式定理的另一种特殊情况,可取 $a=1, b=-1$ 。 $$ \sum_{i=0}^m \binom{n}{i}\binom{m}{m-i} = \binom{m+n}{m}\ \ \ (n \geq m)\tag{6} $$ 拆组合数的式子,在处理某些数据结构题时会用到。 完成一个工程需要分 $n$ 个步骤, $a[i](1 \le i \le n)$ 代表第 $i$ 个步骤的不同方法数目。 那么完成这件事共有 $S = a[1] \times a[2] \times \cdots \times a[n]$ 种不同的方法。 $$ \sum_{i=0}^n\binom{n}{i}^2=\binom{2n}{n}\tag{7} $$ 这是 $(6)$ 的特殊情况,取 $n=m$ 即可。 $$ \sum_{i=0}^ni\binom{n}{i}=n2^{n-1}\tag{8} $$ ### 两原理的区别 带权和的一个式子,通过对 $(3)$ 对应的多项式函数求导可以得证。 **一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。** $$ \sum_{i=0}^ni^2\binom{n}{i}=n(n+1)2^{n-2}\tag{9} $$ ## 几个关于组合的公式 与上式类似,可以通过对多项式函数求导证明。 $$ C_n^0 + C_n^1 + C_n^2 + C_n^3 + \cdots + C_n^m = 2^n \sum_{l=0}^n\binom{l}{k} = \binom{n+1}{k+1}\tag{10} $$ 可以通过组合意义证明,在恒等式证明中较常用。 $$ C_n^r + C_n^{r+1} = C_{n+1}^{r+1} \binom{n}{r}\binom{r}{k} = \binom{n}{k}\binom{n-k}{r-k}\tag{11} $$ 通过定义可以证明。 $$ \sum_{i=0}^m C_n^i C_m^{m-i} = C_{m+n}^m(n \geq m) \sum_{k=1}^m\binom{m}{k}\binom{n}{k}=\binom{m+n}{m}\tag{12} $$ 可以通过组合意义证明。 $$ \sum_{i=0}^n\binom{n-i}{i}=F_{n+1}\tag{13} $$ 其中 $F$ 是斐波那契数列。 $$ \sum_{l=0}^n \binom{l}{k} = \binom{n+1}{k+1}\tag{14} $$ 通过组合分析——考虑 $S={a_1, a_2, \cdots, a_{n+1}}$ 的 $k+1$ 子集数可以得证。 Loading
docs/math/combination.md +185 −82 Original line number Diff line number Diff line ## 排列组合简介 排列组合是组合数学中的一种。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。 排列组合是组合数学中的基础。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。 在高中初等数学中,排列组合多是利用列表、枚举等方法解题。 * * * ## 排列组合公式及定义 ## 加法 & 乘法原理 ### 加法原理 完成一个工程可以有 $n$ 类办法, $a_i(1 \le i \le n)$ 代表第 $i$ 类方法的数目。那么完成这件事共有 $S=a_1+a_2+\cdots +a_n$ 种不同的方法。 ### 排列的定义 ### 乘法原理 完成一个工程需要分 $n$ 个步骤, $a_i(1 \le i \le n)$ 代表第 $i$ 个步骤的不同方法数目。那么完成这件事共有 $S = a_1 \times a_2 \times \cdots \times a_n$ 种不同的方法。 ## 排列与组合基础 从 $n$ 个不同元素中,任取 $m$ ( $m\leqslant n$ , $m$ 与 $n$ 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个排列;从 $n$ 个不同元素中取出 $m$ ( $m\leqslant n$ ) 个元素的所有排列的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的排列数,用符号 $A_n^m$ (或者是 $P_n^m$ )表示。 ### 排列数 ### 排列的计算公式 从 $n$ 个不同元素中,任取 $m$ ( $m\leq n$ , $m$ 与 $n$ 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个排列;从 $n$ 个不同元素中取出 $m$ ( $m\leq n$ ) 个元素的所有排列的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的排列数,用符号 $\mathrm A_n^m$ (或者是 $\mathrm P_n^m$ )表示。 排列的计算公式如下: $$ A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} $$ ** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ .** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ 。 ### 组合的定义 公式可以这样理解: $n$ 个人选 $m$ 个来排队 ( $m \le n$ )。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推,第 $m$ 个(最后一个)可以选 $n-m+1$ 个,得: 从 $n$ 个不同元素中,任取 $m$ ( $m\leqslant n$ ) 个元素组成一个集合,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个组合;从 $n$ 个不同元素中取出 $m$ ( $m≤n$ ) 个元素的所有组合的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的组合数。用符号 $C_n^m$ (或者是 $\binom{m}{n}$ )表示。 $$ \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} $$ ### 组合的计算公式 全排列: $n$ 个人全部来排队,队长为 $n$ 。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推得: $$ C_n^m = \frac{A_n^m}{m!} = \frac{n!}{m!(n - m)!} \mathrm A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n! $$ ## 排列组合的分类 全排列是排列数的一个特殊情况。 ### 组合数 ### 排列 从 $n$ 个不同元素中,任取 $m$ ( $m\leq n$ ) 个元素组成一个集合,叫做从 $n$ 个不同元素中取出 $m$ 个元素的一个组合;从 $n$ 个不同元素中取出 $m$ ( $m\leq n$ ) 个元素的所有组合的个数,叫做从 $n$ 个不同元素中取出 $m$ 个元素的组合数。用符号 $\mathrm C_n^m$ 来表示。 **全排列** : $n$ 个人全部来排队,队长为 $n$ 。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推得: 组合数计算公式 $$ A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n! \mathrm C_n^m = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n - m)!} $$ **部分排列** : $n$ 个人选 $m$ 个来排队 ( $m \le n$ )。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推,第 $m$ 个(最后一个)可以选 $n-m+1$ 个,得: 如何理解上述公式?我们考虑 $n$ 个人 $m$ ( $m \le n$ ) 个出来,不排队,不在乎顺序 $C_n^m$ 。如果在乎排列那么就是 $A_n^m$ ,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 $m$ 个人,他们还要“全排”得 $A_n^m$ ,所以得: $$ A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} \mathrm C_n^m \times m! = \mathrm A_n^m\\ \mathrm C_n^m = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n-m)!} $$ ### 组合 组合数也常用 $\displaystyle \binom{n}{m}$ 表示,读作「 $n$ 选 $m$ 」,即 $\displaystyle \mathrm C_n^m=\binom{n}{m}$ 。实际上,后者表意清晰明了,美观简洁,因此现在数学界普遍采用 $\displaystyle \binom{n}{m}$ 的记号而非 $\mathrm C_n^m$ 。 $n$ 个人 $m$ ( $m \le n$ ) 个出来,不排队,不在乎顺序 $C_n^m$ 。如果在乎排列那么就是 $A_n^m$ ,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 $m$ 个人,他们还要“全排”得 $A_n^m$ ,所以得: 组合数也被称为「二项式系数」,下文二项式定理将会阐述其中的联系。 $$ C_n^m \times m! = A_n^m $$ 特别地,规定当 $m>n$ 时, $\mathrm A_n^m=\mathrm C_n^m=0$ 。 ## 二项式定理 在进入排列组合进阶篇之前,我们先介绍一个与组合数密切相关的定理——二项式定理。 二项式定理阐明了一个展开式的系数: $$ C_n^m = \frac{A_n^m}{m!} = \frac{n!}{m!(n-m)!} (a+b)^n=\sum_{i=0}^n\binom{n}{i}a^{n-i}b^i $$ #### 组合数的性质 证明可以采用数学归纳法,利用 $\displaystyle \binom{n}{k}+\binom{n}{k-1}=\binom{n+1}{k}$ 做归纳。 二项式定理也可以很容易扩展为多项式的形式: 设 n 为正整数, $x_i$ 为实数, $$ C_n^m = C_{n}^{n-m} (x_1 + x_2 + \cdots + x_t)^n = \sum_{满足 n_1 + \cdots + n_t=n 的非负整数解} \binom{n}{n_1n_2\cdots n_t} x_1^{n_1}x_2^{n_2}\cdots x_t^{n_t} $$ 相当于将选出的集合对全集取补集,故数值不变。 其中的 $\binom{n}{n_1n_2\cdots n_t}$ 是多项式系数,它的性质也很相似: $$ C_n^m = C_{n-1}^{m} + C_{n-1}^{m-1} \sum{\binom{n}{n_1n_2\cdots n_t}} = t^n $$ 杨辉三角的公式表达。思考一下怎么利用这个式子,在 $O(n^2)$ 的复杂度下推导组合数? ## 排列与组合进阶篇 ### 圆排列 接下来我们介绍一些排列组合的变种。 ### 多重集的排列数 | 多重组合数 请大家一定要区分 **多重组合数** 与 **多重集的组合数** !两者是完全不同的概念! $n$ 个人全部来围成一圈为 $Q_n^n$ ,其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以: 多重集是指包含重复元素的广义集合。设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集, $S$ 的全排列个数为 $$ Q_n^n \times n = A_n^n → Q_n = \frac{A_n^n}{n} = (n-1)! \frac{n!}{\prod_{i=1}^kn_i!}=\frac{n!}{n_1!n_2!\cdots n_k!} $$ 由此可知部分圆排列的公式: 相当于把相同元素的排列数除掉了。具体地,你可以认为你有 $k$ 种不一样的球,每种球的个数分别是 $n_1,n_2,\cdots,n_k$ ,且 $n=n_1+n_2+\ldots+n_k$ 。这 $n$ 个球的全排列数就是 **多重集的排列数** 。多重集的排列数常被称作 **多重组合数** 。我们可以用多重组合数的符号表示上式: $$ Q_n^r = \frac{A_n^r}{r} = \frac{n!}{r \times (n-r)!} \binom{n}{n_1,n_2,\cdots,n_k}=\frac{n!}{\prod_{i=1}^kn_i!} $$ ### 重复排列(有限) 可以看出, $\displaystyle \binom{n}{m}$ 等价于 $\displaystyle \binom{n}{m,n-m}$ ,只不过后者较为繁琐,因而不采用。 ### 多重集的组合数 1 $k$ 种不一样的球,每种球的个数分别是 $a_1,a_2,\cdots,a_k$ ,设 $n=a_1+a_2+\ldots+a_k$ ,这 $n$ 个球的全排列数,为 设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集。那么对于整数 $r(r<n_i,\forall i\in[1,k])$ ,从 $S$ 中选择 $r$ 个元素组成一个多重集的方案数就是 **多重集的组合数** 。这个问题等价于 $x_1+x_2+\cdots+x_k=r$ 的非负整数解的数目,可以用插板法解决,答案为 $$ \frac{n!}{a_1! \times a_2! \times \cdots \times a_k!} \binom{r+k-1}{k-1} $$ ### 重复组合(无限) ### 多重集的组合数 2 考虑这个问题:设 $S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\}$ 表示由 $n_1$ 个 $a_1$ , $n_2$ 个 $a_2$ ,…, $n_k$ 个 $a_k$ 组成的多重集。那么对于正整数 $r$ ,从 $S$ 中选择 $r$ 个元素组成一个多重集的方案数。 这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解: $$ \forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r $$ $n$ 种不一样的球,每种球的个数是无限的,从中选 $k$ 个出来,不用排列,是组合,为 $C_{n+k-1}^{k}$ . 于是很自然地想到了容斥原理。容斥的模型如下: 证明: 1. 全集: $\displaystyle \sum_{i=1}^kx_i=r$ 的非负整数解。 2. 属性: $x_i\le n_i$ 。 > 假设选出来的数(排好序): 于是设满足属性 $i$ 的集合是 $S_i$ , $\overline{S_i}$ 表示不满足属性 $i$ 的集合,即满足 $x_i\ge n_i+1$ 的集合。那么答案即为 $$ 1 \le b_1 \le b_2 \le b_3 \le \cdots \le b_k \le n \left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right| $$ > 这题的难点就是 $=$ 号,现在去掉 $=$ 号,所以有: 根据容斥原理,有: $$ 1 \le b_1 < b_2+1 < b_3+2 < b_4+3 < \cdots < b_k+k-1 \le n+k-1 \begin{split} \left|\bigcup_{i=1}^k\overline{S_i}\right| &=&\sum_i\left|\overline{S_i}\right| -\sum_{i,j}\left|\overline{S_i}\cap\overline{S_j}\right| +\sum_{i,j,k}\left|\overline{S_i}\cap\overline{S_j}\cap\overline{S_k}\right| -\cdots\\ &&+(-1)^{k-1}\left|\bigcap_{i=1}^k\overline{S_i}\right|\\ &=&\sum_i\binom{k+r-n_i-2}{k-1} -\sum_{i,j}\binom{k+r-n_i-n_j-3}{k-1}+\sum_{i,j,k}\binom{k+r-n_i-n_j-n_k-4}{k-1} -\cdots\\ &&+(-1)^{k-1}\binom{k+r-\sum_{i=1}^kn_i-k-1}{k-1} \end{split} $$ 中间还是 $k$ 个数!不过已经不是 $b$ 系列,而是 $c$ 系列, **假设 $c[i]=b[i]+i-1$ ,所以** 拿全集 $\displaystyle |U|=\binom{k+r-1}{k-1}$ 减去上式,得到多重集的组合数 $$ 1 \le c_1 < c_2 < c_3 < c_4 < \cdots < c_k \le n+k-1 Ans=\sum_{p=0}^k(-1)^p\sum_{A}\binom{k+r-1-\sum_{A} n_{A_i}-p}{k-1} $$ 所以问题就开始转换为无重复组合问题,即在 $n+k-1$ 个元素中选中 $k$ 个的组合数 $C_{n+k-1}^{k}$ 。 其中 A 是充当枚举子集的作用,满足 $|A|=p,\ A_i<A_{i+1}$ 。 ### 不相邻的排列 $1 \sim n$ 这 $n$ 个自然数中选 $k$ 个,这 $k$ 个数中任何两个数不相邻数的组合有 $C_{n-k+1}^{k}$ 种。 证明和上面的相同(其实就是懒得写),请自行证明 XD $1 \sim n$ 这 $n$ 个自然数中选 $k$ 个,这 $k$ 个数中任何两个数不相邻数的组合有 $\displaystyle \binom {n-k+1}{k}$ 种。 ### 错位排列(错排) ### 错位排列 先看一个小问题: $5$ 本书,编号分别是 $1,2,3,4,5$ ,现在要把这 5 本书是放在编号 $1,2,3,4,5$ 的书架上,要求书的编号和书架的编号不一样,请问有多少种不一样的放置方法? 我们把错位排列问题具体化,考虑这样一个问题: 再看一个小问题: 胸口贴着编号为 $1,2,\cdots,n$ 的 $n$ 个球员分别住在编号为 $1,2,\cdots,n$ 的 $n$ 个房间里面。现规定每个人住一个房间,自己的编号不能和房间的编号一样。 $n$ 封不同的信,编号分别是 $1,2,3,4,5$ ,现在要把这 5 封信放在编号 $1,2,3,4,5$ 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法? 这就是错排问题。当 $n=3$ 时,只能为 312 或 231 这两种。 假设我们考虑到第 $n$ 个信封,初始时我们暂时把第 n 封信放在第 n 个信封中,然后考虑两种情况的递推: 那么错排问题的解题思路是什么呢?我们以第二个问题为例: **递推还是王道!** - 前面 $n-1$ 个信封全部装错; - 前面 $n-1$ 个信封有一个没有装错其余全部装错。 刚开始所有球员都住在和自己编号一样的房间里面。然后错排开始了,第 $n$ 个球员从第 $n$ 个房间出来。 对于第一种情况,前面 $n-1$ 个信封全部装错:因为前面 $n-1$ 个已经全部装错了,所以第 n 封只需要与前面任一一个位置交换即可,总共有 $f(n-1)\times (n-1)$ 种情况。 第一种情况: $n$ 想和 $i(1 \le i \le n-1)$ 其中任何一个球员换房间,其他 $n-2$ 个人换房间的事情,他们就不管了。其他 $n-2$ 个球员的的错排数为 $d[n-2]$ , $n$ 可以和前面 $1 \sim n-1$ 对换,所以有 $n-1$ 个 $d[n-2]$ 。 对于第二种情况,前面 $n-1$ 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 $n-1$ 个信封中如果有一个没装错,那么我们把那个没装错的与 $n$ 交换,即可得到一个全错位排列情况。 第二种情况: $n$ 想和 $i(1 \le i \le n-1)$ 其中任何一个球员换房间,但是 $n$ 只想 $i$ 住在第 $N$ 个房间,而 $n$ 不想住第 $I$ 个房间。 其他情况,我们不可能通过一次操作来把它变成一个长度为 n 的错排。 可能你会这样想:那么 $n$ 可以让 $j$ 住在第 $I$ 号房间里面,然后 $n$ 住在房间 $J$ 。抱歉, $j(1 \le j \le n-1,j\neq i)$ 生气 $n$ 为什么一开始就去找 $i$ 不直接来找 $j$ 。没办法, $n$ 把自己胸口的编码 $N$ 换成了 $I$ ,他假装自己是 $i$ ,然后错排 $1 \sim n-1$ (也就是 $d[n-2]$ )的时候参与进去,这样自己就不会呆在第 $I$ 号房间了。所以有 $n-1$ 个 $d[n-1]$ 。 于是可得错位排列的递推式为 $f(n)=(n-1)(f(n-1)+f(n-2))$ 。 如果理解了以上内容,那么错排的公式就出来了: 错位排列数列的前几项为 $0,1,2,9,44,265$ 。 ### 圆排列 $n$ 个人全部来围成一圈,所有的排列数记为 $\mathrm Q_n^n$ 。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有 $$ d_n = (n-1)(d_{n-2} + d_{n-1}) (n\geq 3) \mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)! $$ 同时也有: 由此可知部分圆排列的公式: $$ d_n = n \times d_{n-1} + (-1)^n \mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!} $$ 错位排列数列为 $0,1,2,9,44,265,\cdots$ ## 组合数性质 | 二项式推论 ## 加法 & 乘法原理 由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。 ### 加法原理 $$ \binom{n}{m}=\binom{n}{n-m}\tag{1} $$ 完成一个工程可以有 $n$ 类办法, $a[i](1 \le i \le n)$ 代表第 $i$ 类方法的数目。 那么完成这件事共有 $S=a[1]+a[2]+\cdots +a[n]$ 种不同的方法。 相当于将选出的集合对全集取补集,故数值不变。(对称性) ### 乘法原理 $$ \binom{n}{k} = \frac{n}{k} \binom{n-1}{k-1}\tag{2} $$ 由定义导出的递推式。 $$ \binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\tag{3} $$ 组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在 $O(n^2)$ 的复杂度下推导组合数。 $$ \binom{n}{0}+\binom{n}{1}+\cdots+\binom{n}{n}=\sum_{i=0}^n\binom{n}{i}=2^n\tag{4} $$ 这是二项式定理的特殊情况。取 $a=b=1$ 就得到上式。 $$ \sum_{i=0}^n(-1)^i\binom{n}{i}=0\tag{5} $$ 二项式定理的另一种特殊情况,可取 $a=1, b=-1$ 。 $$ \sum_{i=0}^m \binom{n}{i}\binom{m}{m-i} = \binom{m+n}{m}\ \ \ (n \geq m)\tag{6} $$ 拆组合数的式子,在处理某些数据结构题时会用到。 完成一个工程需要分 $n$ 个步骤, $a[i](1 \le i \le n)$ 代表第 $i$ 个步骤的不同方法数目。 那么完成这件事共有 $S = a[1] \times a[2] \times \cdots \times a[n]$ 种不同的方法。 $$ \sum_{i=0}^n\binom{n}{i}^2=\binom{2n}{n}\tag{7} $$ 这是 $(6)$ 的特殊情况,取 $n=m$ 即可。 $$ \sum_{i=0}^ni\binom{n}{i}=n2^{n-1}\tag{8} $$ ### 两原理的区别 带权和的一个式子,通过对 $(3)$ 对应的多项式函数求导可以得证。 **一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。** $$ \sum_{i=0}^ni^2\binom{n}{i}=n(n+1)2^{n-2}\tag{9} $$ ## 几个关于组合的公式 与上式类似,可以通过对多项式函数求导证明。 $$ C_n^0 + C_n^1 + C_n^2 + C_n^3 + \cdots + C_n^m = 2^n \sum_{l=0}^n\binom{l}{k} = \binom{n+1}{k+1}\tag{10} $$ 可以通过组合意义证明,在恒等式证明中较常用。 $$ C_n^r + C_n^{r+1} = C_{n+1}^{r+1} \binom{n}{r}\binom{r}{k} = \binom{n}{k}\binom{n-k}{r-k}\tag{11} $$ 通过定义可以证明。 $$ \sum_{i=0}^m C_n^i C_m^{m-i} = C_{m+n}^m(n \geq m) \sum_{k=1}^m\binom{m}{k}\binom{n}{k}=\binom{m+n}{m}\tag{12} $$ 可以通过组合意义证明。 $$ \sum_{i=0}^n\binom{n-i}{i}=F_{n+1}\tag{13} $$ 其中 $F$ 是斐波那契数列。 $$ \sum_{l=0}^n \binom{l}{k} = \binom{n+1}{k+1}\tag{14} $$ 通过组合分析——考虑 $S={a_1, a_2, \cdots, a_{n+1}}$ 的 $k+1$ 子集数可以得证。