跳到正文
LESSON

数列(1)排列组合基础

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


加法 & 乘法原理

加法原理

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

乘法原理

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

排列与组合基础

排列数

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

排列的计算公式如下:

Anm=n(n1)(n2)(nm+1)=n!(nm)! \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!}

n!n! 代表 nn 的阶乘,即 6!=1×2×3×4×5×66! = 1 \times 2 \times 3 \times 4 \times 5 \times 6

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

Anm=n(n1)(n2)(nm+1)=n!(nm)! \mathrm A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!}

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

Ann=n(n1)(n2)3×2×1=n! \mathrm A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n!

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

组合数

nn 个不同元素中,任取 mm(mnm\leq n) 个元素组成一个集合,叫做从 nn 个不同元素中取出 mm 个元素的一个组合;从 nn 个不同元素中取出 mm(mnm\leq n) 个元素的所有组合的个数,叫做从 nn 个不同元素中取出 mm 个元素的组合数。用符号 Cnm\mathrm C_n^m 来表示。

组合数计算公式

Cnm=Anmm!=n!m!(nm)! \mathrm C_n^m = \frac{\mathrm A_n^m}{m!} = \frac{n!}{m!(n - m)!}

如何理解上述公式?我们考虑 nn 个人 mm(mnm \le n) 个出来,不排队,不在乎顺序 CnmC_n^m。如果在乎排列那么就是 AnmA_n^m,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 mm 个人,他们还要“全排”得 AnmA_n^m,所以得:

Cnm×m!=AnmCnm=Anmm!=n!m!(nm)! \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)!}

组合数也常用 (nm)\displaystyle \binom{n}{m} 表示,读作「nnmm」,即 Cnm=(nm)\displaystyle \mathrm C_n^m=\binom{n}{m}。实际上,后者表意清晰明了,美观简洁,因此现在数学界普遍采用 (nm)\displaystyle \binom{n}{m} 的记号而非 Cnm\mathrm C_n^m

组合数也被称为「二项式系数」,下文二项式定理将会阐述其中的联系。

特别地,规定当 m>nm>n 时,Anm=Cnm=0\mathrm A_n^m=\mathrm C_n^m=0

二项式定理

在进入排列组合进阶篇之前,我们先介绍一个与组合数密切相关的定理——二项式定理。

二项式定理阐明了一个展开式的系数:

(a+b)n=i=0n(ni)anibi (a+b)^n=\sum_{i=0}^n\binom{n}{i}a^{n-i}b^i

证明可以采用数学归纳法,利用 (nk)+(nk1)=(n+1k)\displaystyle \binom{n}{k}+\binom{n}{k-1}=\binom{n+1}{k} 做归纳。

二项式定理也可以很容易扩展为多项式的形式:

设 n 为正整数,xix_i 为实数,

(x1+x2++xt)n=满足n1++nt=n的非负整数解(nn1n2nt)x1n1x2n2xtnt (x_1 + x_2 + \cdots + x_t)^n = \sum_{\text{满足}n_1 + \cdots + n_t=n\text{的非负整数解}} \binom{n}{n_1n_2\cdots n_t} x_1^{n_1}x_2^{n_2}\cdots x_t^{n_t}

其中的 (nn1,n2,,nt)\binom{n}{n_1,n_2,\cdots ,n_t} 是多项式系数,它的性质也很相似:

(nn1n2nt)=tn \sum{\binom{n}{n_1n_2\cdots n_t}} = t^n

排列与组合进阶篇

接下来我们介绍一些排列组合的变种。

多重集的排列数 | 多重组合数

请大家一定要区分 多重组合数多重集的组合数!两者是完全不同的概念!

多重集是指包含重复元素的广义集合。设 S={n1a1,n2a2,,nkak,}S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\} 表示由 n1n_1a1a_1n2n_2a2a_2,…,nkn_kaka_k 组成的多重集,SS 的全排列个数为

n!i=1kni!=n!n1!n2!nk! \frac{n!}{\prod_{i=1}^kn_i!}=\frac{n!}{n_1!n_2!\cdots n_k!}

相当于把相同元素的排列数除掉了。具体地,你可以认为你有 kk 种不一样的球,每种球的个数分别是 n1,n2,,nkn_1,n_2,\cdots,n_k,且 n=n1+n2++nkn=n_1+n_2+\ldots+n_k。这 nn 个球的全排列数就是 多重集的排列数。多重集的排列数常被称作 多重组合数。我们可以用多重组合数的符号表示上式:

(nn1,n2,,nk)=n!i=1kni! \binom{n}{n_1,n_2,\cdots,n_k}=\frac{n!}{\prod_{i=1}^kn_i!}

可以看出,(nm)\displaystyle \binom{n}{m} 等价于 (nm,nm)\displaystyle \binom{n}{m,n-m},只不过后者较为繁琐,因而不采用。

多重集的组合数 1

S={n1a1,n2a2,,nkak,}S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\} 表示由 n1n_1a1a_1n2n_2a2a_2,…,nkn_kaka_k 组成的多重集。那么对于整数 r(r<ni,i[1,k])r(r<n_i,\forall i\in[1,k]),从 SS 中选择 rr 个元素组成一个多重集的方案数就是 多重集的组合数。这个问题等价于 x1+x2++xk=rx_1+x_2+\cdots+x_k=r 的非负整数解的数目,可以用插板法解决,答案为

(r+k1k1) \binom{r+k-1}{k-1}

多重集的组合数 2

考虑这个问题:设 S={n1a1,n2a2,,nkak,}S=\{n_1\cdot a_1,n_2\cdot a_2,\cdots,n_k\cdot a_k,\} 表示由 n1n_1a1a_1n2n_2a2a_2,…,nkn_kaka_k 组成的多重集。那么对于正整数 rr,从 SS 中选择 rr 个元素组成一个多重集的方案数。

这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解:

i[1,k], xini, i=1kxi=r \forall i\in [1,k],\ x_i\le n_i,\ \sum_{i=1}^kx_i=r

于是很自然地想到了容斥原理。容斥的模型如下:

  1. 全集:i=1kxi=r\displaystyle \sum_{i=1}^kx_i=r 的非负整数解。
  2. 属性:xinix_i\le n_i

于是设满足属性 ii 的集合是 SiS_iSi\overline{S_i} 表示不满足属性 ii 的集合,即满足 xini+1x_i\ge n_i+1 的集合。那么答案即为

i=1kSi=Ui=1kSi \left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right|

根据容斥原理,有:

i=1kSi=iSii,jSiSj+i,j,kSiSjSk+(1)k1i=1kSi=i(k+rni2k1)i,j(k+rninj3k1)+i,j,k(k+rninjnk4k1)+(1)k1(k+ri=1knik1k1) \begin{aligned} \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{aligned}

拿全集 U=(k+r1k1)\displaystyle |U|=\binom{k+r-1}{k-1} 减去上式,得到多重集的组合数

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

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

不相邻的排列

1n1 \sim nnn 个自然数中选 kk 个,这 kk 个数中任何两个数都不相邻的组合有 (nk+1k)\displaystyle \binom {n-k+1}{k} 种。

错位排列

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

nn 封不同的信,编号分别是 1,2,3,4,51,2,3,4,5,现在要把这五封信放在编号 1,2,3,4,51,2,3,4,5 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法?

假设我们考虑到第 nn 个信封,初始时我们暂时把第 nn 封信放在第 nn 个信封中,然后考虑两种情况的递推:

  • 前面 n1n-1 个信封全部装错;
  • 前面 n1n-1 个信封有一个没有装错其余全部装错。

对于第一种情况,前面 n1n-1 个信封全部装错:因为前面 n1n-1 个已经全部装错了,所以第 nn 封只需要与前面任一一个位置交换即可,总共有 f(n1)×(n1)f(n-1)\times (n-1) 种情况。

对于第二种情况,前面 n1n-1 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 n1n-1 个信封中如果有一个没装错,那么我们把那个没装错的与 nn 交换,即可得到一个全错位排列情况。

其他情况,我们不可能通过一次操作来把它变成一个长度为 nn 的错排。

于是可得错位排列的递推式为 f(n)=(n1)(f(n1)+f(n2))f(n)=(n-1)(f(n-1)+f(n-2))

错位排列数列的前几项为 0,1,2,9,44,2650,1,2,9,44,265

圆排列

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

Qnn×n=AnnQn=Annn=(n1)! \mathrm Q_n^n \times n = \mathrm A_n^n \Longrightarrow \mathrm Q_n = \frac{\mathrm A_n^n}{n} = (n-1)!

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

Qnr=Anrr=n!r×(nr)! \mathrm Q_n^r = \frac{\mathrm A_n^r}{r} = \frac{n!}{r \times (n-r)!}

组合数性质 | 二项式推论

在此介绍一些组合数的性质。

(nm)=(nnm)(1) \binom{n}{m}=\binom{n}{n-m}\tag{1}

相当于将选出的集合对全集取补集,故数值不变。(对称性)

(nk)=nk(n1k1)(2) \binom{n}{k} = \frac{n}{k} \binom{n-1}{k-1}\tag{2}

由定义导出的递推式。

(nm)=(n1m)+(n1m1)(3) \binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\tag{3}

组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在 O(n2)O(n^2) 的复杂度下推导组合数。

(n0)+(n1)++(nn)=i=0n(ni)=2n(4) \binom{n}{0}+\binom{n}{1}+\cdots+\binom{n}{n}=\sum_{i=0}^n\binom{n}{i}=2^n\tag{4}

这是二项式定理的特殊情况。取 a=b=1a=b=1 就得到上式。

i=0n(1)i(ni)=[n=0](5) \sum_{i=0}^n(-1)^i\binom{n}{i}=[n=0]\tag{5}

二项式定理的另一种特殊情况,可取 a=1,b=1a=1, b=-1。式子的特殊情况是取 n=0n=0 时答案为 11

i=0m(ni)(mmi)=(m+nm)   (nm)(6) \sum_{i=0}^m \binom{n}{i}\binom{m}{m-i} = \binom{m+n}{m}\ \ \ (n \geq m)\tag{6}

拆组合数的式子,在处理某些数据结构题时会用到。

i=0n(ni)2=(2nn)(7) \sum_{i=0}^n\binom{n}{i}^2=\binom{2n}{n}\tag{7}

这是 (6)(6) 的特殊情况,取 n=mn=m 即可。

i=0ni(ni)=n2n1(8) \sum_{i=0}^ni\binom{n}{i}=n2^{n-1}\tag{8}

带权和的一个式子,通过对 (3)(3) 对应的多项式函数求导可以得证。

i=0ni2(ni)=n(n+1)2n2(9) \sum_{i=0}^ni^2\binom{n}{i}=n(n+1)2^{n-2}\tag{9}

与上式类似,可以通过对多项式函数求导证明。

l=0n(lk)=(n+1k+1)(10) \sum_{l=0}^n\binom{l}{k} = \binom{n+1}{k+1}\tag{10}

通过组合分析一一考虑 S=a1,a2,,an+1S={a_1, a_2, \cdots, a_{n+1}}k+1k+1 子集数可以得证,在恒等式证明中比较常用。

(nr)(rk)=(nk)(nkrk)(11) \binom{n}{r}\binom{r}{k} = \binom{n}{k}\binom{n-k}{r-k}\tag{11}

通过定义可以证明。

i=0n(nii)=Fn+1(12) \sum_{i=0}^n\binom{n-i}{i}=F_{n+1}\tag{12}

其中 FF 是斐波那契数列。