组合数学学习笔记

· · 算法·理论

Part 1 基础知识

一、加法原理

若一件事有 n 种完成方式,而每种方式有 m 种方法,那么这件事的完成方法有 \sum_{i=1}^nm_i 种。

二、乘法原理

若完成一件事有 n 个步骤,而完成每个步骤有 m 种方法,那么这件事的完成方法有 \prod_{i=1}^nm_i 种。

三、排列

  1. 定义:n 个元素中按顺序选出 m 个的方案数,记为 A_n^m

  2. 求法:

我们知道第一个元素有 n 种选择方案,第二个元素有 n-1 种选择方案,以此类推,第 m 个元素有 n-m+1 种选择方案。根据乘法原理可知,总的选择方法有:

n\cdot(n-1)\cdot(n-2)\cdots (n-m+1)

方便起见,我们定义:

阶乘:n!=\prod_{i=1}^ni=1\cdot2\cdots (n-1)\cdot nn 的阶乘。规定 0! = 1

下降(阶乘)幂:n^{\underline{m}}=\prod_{i=0}^{m-1}(n-i)=n\cdot(n-1)\cdot(n-2)\cdots (n-m+1)nm 次下降(阶乘)幂

结合排列的定义可得

A_n^m=\frac{n!}{(n-m)!}=n^{\underline m}

n=m 时,称为 n 的全排列。

四、组合

  1. 定义:n 个元素中,选出 m 个的方案数,记为 C_n^m,又记为 n\choose m

事实上,组合就是不考虑顺序的排列。

  1. 求法

因为组合数选出来的是没有顺序的,而排列选出来的是有顺序的,而这选出来的 m 个元素的排列方式有 A_m^m=m! 种。那么这 n 个元素的组合有:

C_n^m=\frac{A_n^m}{A_m^m}=\frac{n!}{(n-m)!m!}

Part 2 一些定理

一、组合数的性质定理

{n\choose m}={n\choose n-m}

由以上定理,可以容易地推出组合数的递推式:

{n\choose m}={n-1\choose m}+{n-1\choose m-1}

根据递推式,我们便可以 O(n^2) 求出组合数。

二、二项式定理

(a+b)^n=\sum_{i=0}^n{n\choose i}a^ib^{n-i}

我们可以考虑右式由 n 个多项式 (a+b) 相乘得到。若 a 的幂为 i,说明在 n 个多项式中,有 i 个选择了 a。从 n 个多项式中选择 i 个的数量为 n\choose i

三、二项式反演

f(n)=\sum_{i=0}^n{n\choose i}g(i)\iff g(n)=\sum_{i=0}^n{n\choose i}(-1)^{n-i}f(i)

证明:

\begin{aligned} \sum_{i=0}^n{n\choose i}(-1)^{n-i}f(i)&=\sum_{i=0}^n{n\choose i}(-1)^{n-i}\sum_{j=0}^i{i\choose j}g(j)\\ &=\sum_{i=0}^n\sum_{j=0}^i{n\choose i}{i\choose j}(-1)^{n-i}g(j)\\ &=\sum_{i=0}^n\sum_{j=0}^i{n\choose j}{n-j\choose i-j}(-1)^{n-i}g(j)\\ &=\sum_{j=0}^n{n\choose j}g(j)\sum_{i=j}^n{n-j\choose i-j}(-1)^{n-i}\\ &=\sum_{j=0}^n{n\choose j}g(j)\sum_{i=0}^{n-j}{n-j\choose i}(-1)^{n-j-i}\\ &=\sum_{j=0}^n{n\choose j}g(j)\cdot 0^{n-j}\\ &=g(n)\\ \end{aligned} \square

在上面的证明中,为了方便,我们认为 0^0 = 1

四、一些特殊的排列组合

  1. 可重排列:n 个元素中可重复地选取 m 个,总方案数为 n^m

  2. 圆排列:n 个元素中选取 r 个排成一个圆的方案数称为圆排列数,记为 Q_n^r

由于循环的位移可以带来相同的排列,所以 Q_n^r=\frac{A_n^r}{r}

  1. 可重组合:n 个元素中可重复地选取 m 个组成一个集合的方案数称为可重组合数,记为 H_n^m

设这 n 个元素为 1,2,\cdots,n,设取出的 m 个元素为 x_1,x_2,\cdots,x_m(x_1\le x_2\le\cdots\le x_m)。我们令 y_k=x_k+k-1,得到另一组数 y_1,y_2,\cdots,y_m(y_1\le y_2\le\cdots\le y_m),这组数可以看作是从 n-m+1 个不同元素中选出来的,于是有 H_n^m=C_{n-m+1}^m

五、卢卡斯定理

这是一个特别重要的定理。

先给出这个定理的内容:

对于质数 p,有

{n\choose m} \bmod p= {\lfloor n/p \rfloor\choose\lfloor m/p\rfloor} \cdot{n\bmod p\choose m\bmod p}\bmod p

时间复杂度 O(f(p)+g(n)\log n),其中 f(n) 为预处理组合数的复杂度,g(n) 为单次处理组合数的复杂度。

具体的证明可以参考 oi-wiki 的证明。

通过上式,我们便可以递归求出一个组合数对质数取模的结果。现给出具体的代码实现。

int Lucas(int n,int m)
{
    if (m == 0) return 1;
    return (C(n%p,m%p)*Lucas(n/p,m/p))%p;
}

六、组合数的其他性质

  1. {n\choose m} = {n\choose n-m} = \frac{n}{m}{n-1\choose m-1}
  2. {n+1\choose m} = {n\choose m}+{n\choose m-1}
  3. {n\choose k}\cdot{k\choose m}={n\choose m}\cdot{n-m\choose k-m}={n\choose k-m}\cdot{n-k+m\choose m}

Part 3 卡特兰数

卡特兰数是一种特殊的组合递推数列,记为 H_n,应用十分广泛。

一、定义

  1. 卡特兰数的计算公式
H_n=\frac{2n\choose n}{n+1}(n\ge2,n\in \mathbb{N_+})
  1. 其他的卡特兰数公式
H_n= \begin{cases} \sum\limits_{i=1}^nH_{i-1}H_{n-i}&n\ge2,n\in\mathbb{N_+}\\ 1&n=0,1 \end{cases} H_n=\frac{H_{n-1}(4n-2)}{n+1}\\ H_n={2n\choose n}-{2n\choose n-1}

二、应用

卡特兰数可以应用于以下问题:

  1. 2n 个人排成一行进入剧场。入场费 5 元。其中只有 n 个人有一张 5 元钞票,另外 n 人只有 10 元钞票,剧院无其它钞票,问有多少种方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?

  2. 有一个大小为 n\times n 的方格图左下角为 (0, 0) 右上角为 (n, n),从左下角开始每次都只能向右或者向上走一单位,不走到对角线 y=x 上方(但可以触碰)的情况下到达右上角有多少可能的路径?

  3. 在圆上选择 2n 个点,将这些点成对连接起来使得所得到的 n 条线段不相交的方法数?

  4. 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数?

  5. 一个栈(无穷大)的进栈序列为 1,2,3, \cdots ,n 有多少个不同的出栈序列?

  6. n+1n-1 组成的 2n 个数 a_1,a_2, \cdots ,a_{2n},其部分和满足 a_1+a_2+ \cdots +a_k \geq 0~(k=1,2,3, \cdots ,2n),有多少个满足条件的数列?

Part 4 常考模型与方法

一、分组问题

球全部相同,盒子之间互不相同。若每个盒子至少放有 k(k\ge2) 个小球,求放置方法数。

应用 隔板法,我们可以在朴素隔板法的基础上给每个盒子去除 k-1 个,最后将这 k-1 个补齐。此时的物品总数有 n-(k-1)m 个,因此答案为 \Large{m-(k-1)m-1\choose m-1}

二、相邻问题

n 个元素排成一排,要求其中 m 个特定元素相邻,求排列方法数。

对于这种问题,我们应用捆绑法。我们将这 m 个特定元素视为一个元素,此时一共有 n-m+1 个元素,排法有 A_{n-m+1}^{n-m+1} 种。考虑到这 m 个特定元素之间有 A_m^m 种排列方法,因此总排法有 A_{n-m+1}^{n-m+1}A_m^m 种。

三、定序问题

n 个元素排成一排,要求其中 m 个元素的相对位置固定但不必相邻,求排列方法数。

我们可以使用 缩倍法,相当于这 m 个元素相同。这时便可容易地得到排列方法有 \frac{n!}{m!} 种。

四、不相邻问题

n 个元素排成一排,要求其中 m 个特定元素不相邻,求排列方法数。

对此,我们应用 插空法。我们先排没有要求的 n-m 个元素,一共 A_{n-m}^{n-m} 种排法。这 n-m 个元素构成了 n-m+1 个空隙,我们可以在空隙中放入至多一个元素,一共 A_{n-m+1}^{m}。所以总方法有 A_{n-m}^{n-m}A_{n-m+1}^{m} 种。

不相邻问题还有以下表现形式:

从排成一排的 n 个座位中选出 m 个,要求这 m 个座位不相邻,求总选择方案数。

考虑除去这 m 个座位,一共有 n-m 个座位,构成了 n-m+1 个空隙,可以从中选出 m 个座位即可。答案为 n-m+1 \choose m

五、直线染色问题

n 个排成一排的物品,用 m 种颜色对其染色,要求相邻的颜色不同,求染色方法。

第一个物品可以用这 m 种颜色随意染色,而其他的物品可以用与它们上一个物品不同的 m-1 种颜色染色。由乘法原理可知一共有 n(m-1)^{n-1} 种染法。

六、环形染色问题

如图,用 m 种颜色给 n 个区域染色,要求相邻两区域颜色不同,求染色方法。

我们将 A_1A_n 分开,将其变成一条直线,就转化为了第五种题型。我们记有 n 个区域时的染色方法有 a_n 种。

由加法原理,可知

a_n+a_{n-1}=m(m-1)^{n-1}

且有 a_2=m(m-1)

由数列的知识可知答案为

a_n=(m-1)^n+(-1)^n(m-1)

七、传球问题

设共有 m 人传球,求传递 n 次后,球回到了发球人手中的方案数。

设答案为 a_n,我们知道,传递 n-1 次时,球不在发球人手中的方案数为 a_n。那么,此问题即为 n-1 个区域的环形染色问题。由环形染色问题的结论可知:

a_n=\frac{(m-1)^n}{m}+\frac{(-1)^n(m-1)}{m}

八、错位排列问题

n 个排好的元素重新排列,要求每个元素均与原位置不同,记这样的排列为 D_n

一般地,我们有以下公式:

\begin{aligned} D_n &= n!(\frac{1}{2!}-\frac{1}{3!}+\cdots+(-1)^n\frac{1}{n!})\\ &= n!\sum_{i=2}^n(-1)^i\frac{1}{i!} \end{aligned}

现给出该公式的证明:

对于位置 1 上的原元素,可放与出位置 1 以外的 n-1 个位置种任一位置 k。此时,位置 k 上的原元素 a_k 有两种选择:

  1. 放于位置1,此时问题转化为除 a_1a_kn-2 个元素的错位排列问题。

  2. 放于除位置 1 和位置 k 之外的其他任一位置 m,此时省略元素 a_k 和位置 m,问题转化为 n-1 个元素的错位排列。

由加法、乘法原理,得

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

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

结合数列相关知识,得

a_n-nD_{n-1}=(-1)^{n-3}(D_3-D_2)

易知 D_2=1,D_3=2

D_n-nD_{n-1}=(-1)^n

\frac{D_n}{n!}-\frac{D_{n-1}}{(n-1)!}=\frac{(-1)^n}{n!}

累加即得

\begin{aligned} D_n &= n!(\frac{1}{2!}-\frac{1}{3!}+\cdots+(-1)^n\frac{1}{n!})\\ &= n!\sum_{i=2}^n(-1)^i\frac{1}{i!} \end{aligned} \square

Part 5 容斥原理与抽屉原理

一、容斥原理

设全集 U 中元素有 n 种不同的属性,而第 i 种属性为 P_i,拥有属性 P_i 的元素构成集合 S,那么

\begin{aligned} \left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\sum_{i<j<k}|S_i\cap S_j\cap S_k|-\cdots\\ &+(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^{m}S_{a_i}\right|+\cdots+(-1)^{n-1}|S_1\cap\cdots\cap S_n| \end{aligned}

二、抽屉原理

  1. 简单情况

n+1 个物体,划分为 n 组,那么有至少一组有两个(或以上)的物体。

证明考虑反证法:假如每个分组有至多 1 个物体,那么最多有 1\times n 个物体,而实际上有 n+1 个物体,矛盾。

  1. 推广

n 个物体,划分为 k 组,那么至少存在一个分组,含有大于或等于

推广的形式也可以使用反证法证明:若每个分组含有小于 $\left \lceil \dfrac{n}{k} \right \rceil$ 个物体,则其总和 $S\leq (\left \lceil \dfrac{n}{k} \right \rceil -1 ) \times k=k\left\lceil \dfrac{n}{k} \right\rceil-k < k(\dfrac{n}{k}+1)-k=n $ 矛盾。 此外,划分还可以弱化为覆盖结论不变。 给定集合 $S$, 一个 $S$ 的非空子集构成的簇 $\{A_1,A_2\ldots A_k\}$: - 若满足 $\bigcup_{i=1}^k A_i$ 则称为 $S$ 的一个覆盖(cover)。 - 若一个覆盖还满足 $i\neq j\to A_i\cap A_j=\varnothing$ 则称为 $S$ 的一个划分。 抽屉原理可以有如下叙述:对于 $S$ 的一个覆盖 $\{A_1,A_2\ldots A_k\}$ 有至少一个集合 $A_i$ 满足 $\left\vert A_i \right\vert \geq \left\lceil \dfrac{\left\vert S \right\vert}{k} \right\rceil$。 ### Part 6 斯特林数 **一、第二类斯特林数** 1. **定义:** 第二类斯特林数又称为斯特林子集数,记为 ${n\brace k}$,也记为 $S(n,k)$,表示将 $n$ 个互不相同的元素,划分为 $k$ 个互不区分的非空子集的方案数。 2. **递推式** $$ {n\brace k}={n-1\brace k-1}+k{n-1\brace k} $$ 其边界条件为 ${n\brace 0}=\lbrack n=0\rbrack$。 **证明:** 我们考虑组合数的意义。 当我们插入一个新元素时,有两种方案: - 将新元素单独放入一个子集,有 ${n-1\brace k-1}$ 种方案。 - 将新元素放入一个现有的非空子集,有 $k{n-1\brace k}$ 种方案。 由加法原理,将两式相加即可得到递推式。 $\square
  1. 通项公式
{n\brace m}=\sum_{i=0}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!}

证明:

可以使用容斥原理。

设将 n 个两两不同的元素,划分到 i 个两两不同的集合(允许空集)的方案数为 G_i,将 n 个两两不同的元素,划分到 i 个两两不同的非空集合(不允许空集)的方案数为 F_i

那么有

G_i=i^n\\ G_i=\sum_{j=0}^i{i\choose j}F_j

根据二项式反演

\begin{aligned} F_i&=\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}G_j\\ &=\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}j^n\\ &=\sum\limits_{j=0}^{i}\dfrac{i!(-1)^{i-j}j^n}{j!(i-j)!} \end{aligned}

考虑 F_in\brace i 的关系。第二类斯特林数要求集合之间互不区分,因此 F_i 正好是 n\brace ii! 倍。于是有

{n\brace m}=\frac{F_m}{m!}=\sum_{i=0}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!} \square
  1. 同一行第二类斯特林数的计算

“同一行”的定义为对于相同的 n,求 \begin{Bmatrix}n\\i\end{Bmatrix}。也就是对 i=0\dots n 求出将 n 个不同元素划分为 i 个非空集的方案数。

我们可以根据上面的通项公式,使用卷积计算即可。其时间复杂度为 O(n\log n)

限于本人能力,代码部分暂时先跳过。

二、第一类斯特林数

  1. 定义: 第一类斯特林数又称为斯特林轮换数,记为 \begin{bmatrix}n\\k\end{bmatrix},也记为 s(n,k),表示将 n 个互不相同的元素,划分为 k 个互不区分的非空轮换(圆排列)的方案数。

  2. 递推式

{n\brack k}={n-1\brack k-1}+(n-1){n-1\brack k}

其边界条件为 \begin{bmatrix}n\\0\end{bmatrix}=\lbrack n=0\rbrack

证明:

仍然考虑组合数的意义。

当我们插入一个新元素时,有两种方案:

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

由于第一类斯特林数的用途并不广泛,我们仅作了解,不展开讲述。

三、自然幂、上升幂和下降幂的转换

1,定义

在本文的 \textsf{\textbf{Part 1}} 部分,我们已经对下降幂作出了定义,这里我们进行一个回顾。

自然幂:n^m=\prod_{i=1}^mnnm 次幂。

下降幂:n^{\underline{m}}=\prod_{i=0}^{m-1}(n-i)=n\cdot(n-1)\cdot(n-2)\cdots (n-m+1)nm 次下降幂。

上升幂:n^{\overline{m}}=\prod_{i=0}^{m-1}(n+i)=n\cdot(n+1)\cdot(n+2)\cdots(n+m-1)nm 次上升幂。

  1. 上升幂与自然幂的相互转换

我们可以通过以下恒等式将上升幂转换为自然幂:

x^{\overline{n}}=\sum_k{n\brack k}x^k

而将自然幂转化为上升幂则有下面的恒等式:

x^n=\sum_k{n\brace k}(-1)^{n-k}x^k
  1. 下降幂与自然幂的相互转换

我们可以通过以下恒等式将下降幂转换为自然幂:

x^{\underline{n}}=\sum_k{n\brack k}(-1)^{n-k}x^k

联想到排列的定义,我们可以得到第一类斯特林数的一个性质:

A_n^m=n^{\underline{m}}=\sum_k{m\brack k}(-1)^{m-k}n^k

若要将自然幂转换为下降幂,有以下恒等式:

x^n=\sum_k{n\brace k}x^k

Part 7 范德蒙德卷积

一、定义

范德蒙德卷积是一种合并组合数的公式,主要用于组合数学的公式推导,其公式如下

\sum_{i=0}^k{n\choose i}{m\choose k-i}={n+m\choose k}

证明:

考虑二项式定理。

\begin{aligned} \sum_{k=0}^{n+m}{n+m\choose k}x^k &=(x+1)^{n+m}\\ &=(x+1)^n(x+1)^m\\ &=\sum_{r=0}^n{n\choose r}x^r\sum_{s=0}^m{m\choose s}x^s\\ &=\sum_{k=0}^{n+m}\sum_{r=0}^k{n\choose r}{m\choose k-r}x^k \end{aligned}

化简后即得

{n+m\choose k}=\sum_{i=0}^k{n\choose i}{m\choose k-i} \square

二、推论

  1. 推论一
\sum_{i=-r}^{s}\binom{n}{r+i}\binom{m}{s-i}=\binom{n+m}{r+s}

证明仅需将原证明的 i-r 开始枚举即可。

  1. 推论二
\sum_{i=1}^n\binom{n}{i}\binom{n}{i-1}=\binom{2n}{n-1}

证明:

根据组合数的性质定理,有

\begin{aligned} \sum_{i=1}^n{n\choose i}{n\choose i-1} &=\sum_{i=0}^{n-1}{n\choose i+1}{n\choose i}\\ &=\sum_{i=0}^{n-1}{n\choose n-1-i}{n\choose i}\\ &={2n\choose n-1} \end{aligned} \square
  1. 推论三
\sum_{i=0}^n{n\choose i}^2={2n\choose n}

证明:

根据组合数的性质定理,易得

\begin{aligned} \sum_{i=0}^n{n\choose i}^2&=\sum_{i=0}^n{n\choose n-i}\\ &={2n\choose n} \end{aligned} \square
  1. 推论四
\sum_{i=0}^m\binom{n}{i}\binom{m}{i}=\binom{n+m}{m}

证明:

\begin{aligned} \sum_{i=0}^m{n\choose i}{m\choose i}&= \sum_{i=0}^m{n\choose i}{m\choose m-i}\\ &={n+m\choose m} \end{aligned} \square