跳到主要内容

组合数学

· 阅读需 6 分钟

数学全部都去4吧!

1.欧拉错排​

题目背景:有nn个小球,编号分别是1−>n1->n,要求把小球放在编号为1−>1->的盒子中且小球编号与盒子编号不同(每个盒子各放一个)

递推式:f[n]=(n−1)×(f[n−1]+f[n−2])f[n]=(n-1) \times (f[n-1]+f[n-2])

推导过程:

在考虑放第nn个数时,考虑两种情况

<1>前面的数全部放错,可以拿第n个数任意和前面的数交换,情况数为(n−1)×f[n−1]<2>前面的数恰有一个没放错,只能拿第n个与未错数交换,又因为每个数都能成为未错数,情况数为(n−1)×f[n−2]\begin{aligned} &<1>前面的数全部放错,可以拿第n个数任意和前面的数交换,情况数为(n-1) \times f[n-1]\\ &<2>前面的数恰有一个没放错,只能拿第n个与未错数交换,又因为每个数都能成为未错数,情况数为(n-1) \times f[n-2]\\ \end{aligned}

综上所述,f[n]=(n−1)×f[n−1]+(n−1)×f[n−2]=(n−1)×(f[n−1]+f[n−2])f[n]=(n-1) \times f[n-1]+(n-1) \times f[n-2]=(n-1) \times (f[n-1]+f[n-2])

边界情况:f[0]=1,f[1]=0f[0]=1,f[1]=0,具体为什么是这样呢

f[0]=1,既没有盒子也没有球,这就是一种情况(其实这个理解挺玄幻的)f[1]=0,只有一个盒子和一个球,球一只能放在盒一里,不存在满足条件的解\begin{aligned} &f[0]=1,既没有盒子也没有球,这就是一种情况(其实这个理解挺玄幻的)\\ &f[1]=0,只有一个盒子和一个球,球一只能放在盒一里,不存在满足条件的解\\ \end{aligned}


2.Catalan数​

题目背景:将nn个00和nn个11排成一个序列,满足任意前缀中00的数量不小于11的数量

封闭形式:Catn=C2nn−C2nn−1Cat_n=C_{2n}^{n}-C_{2n}^{n-1}

递推式:Catn=4n−2n+1Catn−1=∑p=1nCatp−1×Catn−p,Cat1=1Cat_n=\frac{4n-2}{n+1}Cat_{n-1}=\sum_{p=1}^{n}Cat_{p-1} \times Cat_{n-p},Cat_1=1

推导过程:

<1>

不受限制的排列数:C2nnC_{2n}^{n}

对于任意一个不合法的排列SS,SS中存在一个最靠前的位置2p+1∈[1,2n]2p+1\in [1,2n],使得SS中有pp个00,p+1p+1个11

我们从2p+22p+2开始,将后面序列中的0101相互交换,这样,我们得到了一个长度为2n2n的排列,并且该排列中有n−1n-1个00,n+1n+1个11,即任意一个非法的排列SS都可以与一个n−1n-1个00,n+1n+1个11得到的排列对应

反过来,任意一个n−1n-1个00,n+1n+1个11得到的排列,我们找到最小的位置2p+12p+1,满足该位置处第一次出现11的个数多余00的个数(该位置一定存在),然后将2p+22p+2到2n2n位置上的0101相互交换,这样,我们得到了一个长度为2n2n,nn个00,nn个11的排列,故任意一个n−1n-1个00,n+1n+1个11得到的排列,都对应了一种nn个00,nn个11的排列,且该排列满足某个位置11出现的个数比00出现的个数多

由以上两点可知,这两种排列一一对应,故非法的排列数量为C2nn−1C_{2n}^{n-1},容斥便可得到封闭式

将封闭式变形合并即可得到递推式Catn=4n−2n+1Catn−1Cat_n=\frac{4n-2}{n+1}Cat_{n-1}

<2>

对于任意一个合法的排列,一定存在某个最靠前的位置2p2p,满足到该位置为止,00出现的次数刚好等于11出现的次数

从2p+1−>2n2p+1->2n,始终满足00的个数不少于11的个数,所以这部分的排列数依然是卡特兰数

从1−>2p1->2p呢?

因为直到2p2p才满足00的个数和11的个数相等,又因为2p2p处肯定为11, 这意味这1−>2p−11->2p-1始终满足00的个数多余11的个数,去掉第一个位置的00,从 2−>2p−12->2p-1, 始终满足00的个数大于等于11的个数,所以我们去掉头部的00,2p2p处的11,中间的部分就是一个满足卡特兰数的排列,

所以,当2p2p是第一个00,11个数相等的位置时,方案数为Catp−1×Catn−pCat_{p-1} \times Cat_{n-p}

因为1≤p≤n1 \leq p \leq n,所以Catn=∑p=1nCatp−1×Catn−pCat_n=\sum_{p=1}^{n}Cat_{p-1} \times Cat_{n-p}


3.Stirling数​

斯特林数分为两类

<1>第一类斯特林数

题目背景:把nn个互不相同的小球构成rr个圆排列

递推式:Stirn=(n−1)×Stirn−1×Stir−1n−1Sti_{r}^{n}=(n-1) \times Sti_{r}^{n-1} \times Sti_{r-1}^{n-1}

推导过程:在考虑StirnSti_{r}^{n}(nn个球构成rr个圆排列)时,考虑两种情况

如果将第nn个数单独构成一个圆排列,则方案数就变为了Stir−1n−1Sti_{r-1}^{n-1}

否则考虑将第nn个数放在已构好的圆排列中,即Stirn−1Sti_{r}^{n-1}

因为是圆排列,只关心相对位置,所以有n−1n-1种可能(可以想象成把nn和另一个数合并得到一个新数),方案数就是(n−1)×Stirn−1(n-1) \times Sti_{r}^{n-1}

由乘法原理就可算得递推式

边界情况:Stinn=1Sti_{n}^{n}=1,恰好每个圆内放一个数才满足条件

Stin0=0Sti_{n}^{0}=0,至少要一个圆放数才能满足条件

<2>第二类斯特林数

题目背景:把nn个互不相同的小球放进rr个相同的盒子,每个盒子至少一个球

递推式:Stirn=r×Stirn−1×Stir−1n−1Sti_{r}^{n}=r \times Sti_{r}^{n-1} \times Sti_{r-1}^{n-1}

推导过程:第二类斯特林数和第一类很像,这里不过多赘述

唯一的区别在于在第二类斯特林数中,元素在哪些集合并不重要,唯一重要的是各集合里装的是什么,而不管哪个集合装了什么

所以我们的选择就变成了rr种每个盒子中讨论放入