组合数学学习笔记
一.基本法则
1.加法法则
设事件\(A\)有\(m\)种产生方式,事件\(B\)有\(n\)种产生方式,事件\(A\)与事件\(B\)相互独立,那么“事件\(A\)或\(B\)”共有\(m+n\)种产生方式。
加法法则注重于分类问题的解决。
2.乘法法则
设事件\(A\)有\(m\)种产生方式,事件\(B\)有\(n\)种产生方式,事件\(A\)与事件\(B\)相互独立,那么“事件\(A\)与\(B\)”共有\(m*n\)种产生方式。
乘法法则注重于分步问题的解决。
二.排列
1.不可重排列
从\(n\)个不同的元素中取出\(r\)个元素,按次序排列的方案数,称作从\(n\)个中取\(r\)个的无重排列,用\(A(n,r)\)表示。
2.可重排列数
从\(n\)个元素中取\(r\)个元素,每个元素可以重复取,方案数为\(n^r\),即每个位置有\(n\)个选择,共\(r\)个位置。
3.圆排列
从\(n\)个元素中取出\(r\)个元素形成一个环,最终环的个数。
方案数为\(\frac{A(n,r)}{r}\),即先考虑所有的排列情况并将其连接成环,一个环从中间断开会形成\(r\)个序列,那么所有的情况除以\(r\)则得到最终方案数。
4.项链排列
类似于圆排列,但是项链可以翻转,所以方案数为:
5.多重集的排列
设元素\(a_1,a_2,\cdots,a_k\)互不相同,每个元素有\(n_i\)个,那么所有元素的全排列为:
可记为\(n\choose n_1n_2\cdots n_k\)。
可以理解为:先将所有的元素打上标号,那么就全为不同的元素,此时方案数为\(n!\),之后对于每一类元素消除其冗余度\(n_i!\)即可。
带限制的排列问题可以用指数型母函数解决。
三.组合
1.无重组合
从\(n\)个元素中取出\(r\)个元素,不考虑元素之间的顺序时,总的方案数。记为\(C(n,r)\)或者\(n\choose r\)。
有公式:
2.可重组合
从\(n\)个元素中取出\(r\)个数,每个元素可以重复取的组合方案数。
可以将问题等价于:把\(r\)个元素划分成\(n\)类,每类元素个数没有要求。
那么方案数即为:
相当于求解\(x_1+x_2+\cdots+x_r=n\)的非负整数解的方案数,采用隔板法即可求解。
3.不相邻组合
从\(A=\{1,2,\cdots,n\}\)中取\(r\)个不相邻的组合方案数,其组合数为
可采用标号法来求解,假设选取任意一个解\(S=\{1,3,\cdots,n\}\),因为是组合,我们将其按照升序排列,对应位置的下标为\(\{0,1,\cdots,r-1\}\)。我们将元素与对应下标相减(去掉限制条件),那么有\(S'=\{1,2,\cdots,n-r+1\}\)。易知问题转变成了从\(n-r+1\)个数中选取\(r\)个数的组合数。这两者的方案数是一一对应的。
相同的方法可以用来求解可重组合数,只是我们要累加元素的下标(可以去掉重复),同样可以得到上述结果。
4.多重集的组合
可用普通母函数解决。
5.常用公式
组合数为二项式定理展开式中对应项的系数:
相当于\((x+y)\cdot (x+y)\cdot \cdots \cdot (x+y)\)中,每一项只会选取一个,那么若\(x\)选取了\(i\)个,对应\(y\)选取了\(n-i\)个,方案数为\(C(n,i)=C(n,n-i)\)。
根据这个,令\(x=y=1\)则有:
- \(2^n=\sum_{i=0}^n C(n,i)\)
令\(x=1,y=-1\)有:
- \(0=\sum_{i=0}^n (-1)^iC(n,i)\)
还有些其它的式子:
- \(C(n,m)=C(n-1,m-1)+C(n-1,m)\)
考虑第\(m\)个元素选还是不选,分类过后加起来即可。
- \(C(n,m)=C(n,n-m)\)
- \(C(n,m)\cdot C(m,r)=C(n,r)\cdot C(n-r,m-r)\)
组合数还有一些其它的恒等式,就不一一列举了(懒)。
另外,二项式定理还可以扩展为多项式定理:
原理是
可见多项式的系数刚好对应多重集的排列个数。
四.母函数
1.定义
直观点来说,母函数就是一列用来展示一串数字的挂衣架。一般母函数也被称作“生成函数”。
举个例子,序列\(\{a_n\}\)的母函数即为:
母函数一般分为两类:普通型母函数和指数型母函数。其中,普通型母函数主要用来解决多重集的组合问题,而指数型母函数一般用来解决多重集的排列问题。同时,母函数还可以解决递归数列的通项问题。
2.普通型母函数
2.1 整数拆分
用\(1\)~\(m\)之间的整数凑出整数\(n\)的方案数。
如果是有序拆分,相当于\(n\)个无区别小球放入\(m\)个有区别盒子,不允许空盒的方案数,答案为\(C(n-1,r-1)\)。
这里是无序拆分。
对于\(1\)~\(m\)之间的每个整数单独考虑,问题相当于将\(n\)个没有区别的小球划分入\(m\)个没有区别的盒子中且允许有空盒的存在。
每一个的生成函数序列为:
对于\(i=1\)来说:\(G_1(x)\)表示\(1\)这个数取\(0,1,2\cdots\)个的方案数都为\(1\),其余同理。
又因为\(G_i(x)=\frac{1}{1-x^i}\),所以最终的答案为\(G(x)=\prod G_i(x)\)这个多项式中\(x_n\)前面的系数。
2.2 Ferrers图
直接说结论吧,通过\(Ferrers\)图观察可以得到:
- 整数\(n\)划分成最大数为\(m\)的方案数等于整数\(n\)拆分为不超过\(m\)个数的方案数。
- 整数\(n\)拆分成互不相同的若干奇数的和的拆分数与拆分成自共轭的\(Ferrers\)图像的拆分数相等。
2.3 母函数与递推
母函数是求解递推式中数列通项的一大利器。
比如汉诺塔问题中,递推式为:
那么我们构造出序列\(\{h_n\}\)的母函数为:
然后我们利用递推关系来求解:
对应相乘,左边就变为:
右边变为:
然后解得:
因为\(1-x=\sum_{i=0}^{\infty}x_i\),所以就能得到\(h(n)=2^n-1\)。
一般求解递推式的通项都是用的这种方法,后面还有更加简便的方法~
3.指数型母函数
3.1 定义
刚才的普通型母函数中,其实可以发现求解的问题一般是“组合类”的问题,只关心元素的选取而没有关心元素的顺序。
倘若在整数拆分中,选取了\(n_i\)个\(a_i\),现在要关心顺序,那么答案即为多重集的排列数:\(n\choose n_1n_2\cdots n_t\)。
那放在母函数里面,我们可以将式子变为:
这样选取不同的元素以及不同的个数就自动算好了分母部分。
那么对于\(\{a_n\}\)序列,称\(G_e(x)=\sum_{n=0}^{\infty}a_n\frac{x^n}{n!}\)为\(\{a_n\}\)的指数生成函数。
3.2 应用
用\(1,2,3,4\)构成一个五位数,要求\(1\)出现不超过\(2\)次,不能不出现;\(2\)出现不超过\(1\)次;\(4\)出现的次数为偶数。
易知这是一个排列的问题,那么对每种限制构造对应的指数型母函数:
- \(G_{e1}(x)=\frac{x}{1!}+\frac{x^2}{2!}\)
- \(G_{e2}(x)=1+\frac{x}{1!}\)
- \(G_{e3}(x)=1+\frac{x}{1!}+\cdots+\frac{x^5}{5!}\)
- \(G_{e4}(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}\)
那么将这几个相乘,最终\(\frac{x^5}{5!}\)前面的系数即为答案。
3.3 错排问题
给出\(n\)个元素从\(1\)到\(n\),并且存在\(n\)个位置。现在问使得所有的元素都不在其原来位置上的方案数。
先考虑递推:设\(D_n\)为\(n\)个数的错排答案,那么考虑第\(n\)个数:
- 第\(n\)个数在第\(k\)位,并且\(k\)在第\(n\)位的情况,此时的贡献为\((n-1)D_{n-2}\)
- 第\(n\)个数在第\(k\)位,但是\(k\)不在第\(n\)位的情况,此时将\(n\)看作一个新的第\(k\)位,此时前面\(n-1\)个元素的错排一一与之前元素的错排相对应,贡献为\((n-1)D_{n-1}\)。
这两种情况不重不漏的计算出了所有的情况,那么递推式为\(D_n=(n-1)\cdot (D_{n-1}+D_{n-2})\)。
考虑利用指数型母函数求其通项:
将递推式变换得到:
因为\(D_0=0,D_1=1\),有\(D_n-nD_{n-1}=(-1)^n\)。
然后设出相关生成函数:
按照之前的办法,通过递推式来求解通项:
对应相乘就有:
解得
那么就相当于两个函数相乘,最终有
同样,用类似的方法,通过指数型母函数也能得到递推方程的通项公式。
在算法竞赛中,多项式相乘可以通过\(FFT\)优化达到\(O(nlogn)\)的复杂度。
五.线性常系数递推关系
主要说一下线性齐次常系数递推关系,非齐次的话一般就是在其次的基础上加一个特殊解就行了。
1.定义
如果序列\(\{a_n\}\)满足
并且\(a_0=d_0,a_1=d_1,\cdots a_{k-1}=d_{k-1},c_i,d_i\)都为常数。
那么上式就为\(\{a_n\}\)的\(k\)阶线性常系数齐次递推关系。
特点:
- 线性累加和
- 右端项为\(0\)
- 系数是常数
2.特征多项式
假设现在有\(a_n+c_1a_{n-1}+c_2a_{n-2}+\cdots+c_ka_{n-k}=0\),那么现在想要求出其通项,还是利用之前提到的方法(我就不细写了),设\(G(x)\)为序列\(\{a_n\}\)的母函数,那么就有:
这里\(P(x)\)为另一个多项式,先暂且不管。
我们来分析分母,根据之前的经验,我们希望将其化为\(\prod (1-a_ix)\)的形式,那么这样就很方便求通项了。
先提取一个\(x_k\)出来,并且令\(m=x^{-1}\),那么有\(C(m)=(m^k+C_1m^{k-1}+\cdots+C_k\))。
之后进行因式分解为:
之后我们将\(x_k\)对应乘进去,就得到分母的表达式:
这样转换为之前的形式,求解就较为方便了。
观察\(C(m)\),发现它与递推式很像。那么在此给出特征多项式的定义:
对于一个线性常系数齐次递推式(以之前的方程为例),其特征多项式为:
相应地,对于\(k\)阶常系数线性递推方程,其特征方程为:
特征方程的根为特征根。
3.根据特征多项式求解递推关系通解
3.1 无重根
拿之前汉诺塔为例:
我们已知递推关系为\(h(n)=2\cdot h(n-1)-1\),变换一下为\(h(n)-2\cdot h(n-1)=-1\)。
因为右端不为\(0\),我们减一下,有:
得到其递推方程:
因式分解为:
那么回顾之前的式子,我们没有管分子,所以用待定系数法表示出通项:
显然\(h(0)=0,h(1)=1\),代入求解即可得\(h(n)=2^n-1\)。
总结一下步骤:
- 通过\(k\)阶线性齐次递推关系得到特征方程
- 得到特征解(可能有重根)
- 根据特征根用待定系数法表示出通项
- 利用初值求解系数
- 得到答案
可见,通过母函数,能够快速求解一类递推关系的问题,通过特征多项式,将母函数和通解相联系。
3.2 有重根
现在已知递推关系:\(a_n-4a_{n-1}+4a_{n-2}=0,a_0=1,a_1=4\),求解通项。
按照之前方法来推,最终得到:
拆开为:
那么
可以得到\(a_n=2^n\cdot A+(n+1)\cdot 2^n\cdot B\)
那么之后求解系数即可。
所以对于有重根的情况,假设现在有\(e\)重根\(q\),可以直接得到其对应的解为
这里我列举了一个例子方便理解,要证明的话较为复杂,稍微严谨点的证明如下(太菜了不敢乱说话)
设\(q\)为特征方程的\(e\)重根,那么最终的\(G(x)=\sum_{j=1}^{e}\frac{A_j}{(1-qx)^j}\)。
根据这个写出第\(n\)项的表达式:
这里\(C(n+j-1,j-1)\)是关于\(n\)的\(j-1\)次多项式,那么最终的式子是关于\(n\)的\(e-1\)次多项式。
同样用待定系数法表示出来有:
得证。
六.常见序列及性质
1.斐波那契数列
递推式为:
根据递推式可以推出一些恒等式:
- \(F_1^2+F_2^2+\cdots+F_n^2=F_nF_{n+1}\)
将\(F_i\)用\(F_{i+1}-F_{i-1}\)表示,那么\(F_i^2=F_iF_{i+1}-F_iF_{i-1}\),所有累加起来即可得到等式右边。
- \(F_1+F_2+\cdots+F_n=F_{n+2}-1\)
用\(F_{i+2}-F_{i+1}\)表示\(F_i\)即可。
- \(F_1+F_3+\cdots+F_{2n-1}=F_{2n}\)
\(F_{2i+1}=F_{2i+2}-F_{2i}\),然后累加起来即可。
- \(F_{2n}=F_{n-1}F_{n}+F_{n}F_{n+1}\)
证明的话可以将斐波那契线性递推写成矩阵的形式就一目了然了。
- \(F_{n-1}F_{n+1}-F_n^2=(-1)^n\)
数学归纳法可证。
除开恒等式外,还有一些其它的性质:
- 每3个连续的数中有且只有一个被2整除
- 每4个连续的数中有且只有一个被3整除,
- 每5个连续的数中有且只有一个被5整除,
- 每6个连续的数中有且只有一个被8整除,
- 每7个连续的数中有且只有一个被13整除,
- 个位数每60步一循环,后两位数每300步一循环,后三位数,每1500步一循环,后4位数每15000步一循环,后5位数每150000步一循环
斐波那契的通项,用母函数随便求啦。
2.卡特兰数
卡特兰数有一些经典的模型:进出栈问题、二叉树构成、划分三角形等等。
一般的特征就是:在问题中始终存在一个\(\geq\)关系,比如进出栈问题,保证入栈数不小于出栈数;括号问题,左括号数不小于右括号数等等。
卡特兰数的递推式
求解通项,比较简便的话可以用格路模型来解,为:
下面给出母函数的求解法:
首先设出对应生成函数:
根据递推式,将其平方得:
有:
最终求解得到:
然后对\(\sqrt{1-4x}=(1-4x)^{\frac{1}{2}}\)用牛顿二项式展开得:
分子为:
最后再除以一个\(2x\),式子就变为:
所以得到卡特兰数得通项为:
3.斯特林数
3.1 第一类斯特林数
第一类斯特林数表示的是将\(n\)个数分为\(k\)个圆环的方案数,两个圆环不同当且仅当一个圆环通过旋转不能得到另一圆环。
其中,第一类斯特林数也分为两类:无符号斯特林数和有符号斯特林数,无符号斯特林数记为\(\left[^n_k\right]\),有符号斯特林数一般记为\(s(n,k)\)(我貌似也不是很清楚记法...)。
第一类斯特林数有如下递推公式:
分别表示当前第\(n+1\)个数和之前的划分在一起还是单独成一个圈,和其它元素在一起的话那么有\(n\)种可能。
对于有符号的第一类斯特林数,递推公式为:
无符号第一类斯特林数对应递增阶乘展开式的各项系数:
有符号第一类斯特林数对应递减阶乘展开式的各项系数:
性质
显然:\(\begin{bmatrix}
0 \\ 0
\end{bmatrix}=\begin{bmatrix}
n \\ n
\end{bmatrix}=1,\begin{bmatrix}n \\ 0\end{bmatrix}=\begin{bmatrix}0 \\ n\end{bmatrix}=0,n>0\)
还有一些其它的恒等式:
- \(\displaystyle \begin{bmatrix} n \\ 1 \end{bmatrix}=(n-1)! \)
这就类似于一个环的排列。
-
\(\displaystyle \begin{bmatrix} n \\ n-1 \end{bmatrix}=C(n,2) \)
-
\(\displaystyle \begin{bmatrix}n \\ n-2 \end{bmatrix}=2C(n,3)+3C(n,4) \)
第一个简单,第二个等式相当于分类考虑,把两种情况加起来即可。
3.2 第二类斯特林数
第二类斯特林数用放球模型来表示,就是将\(n\)个球,划分成\(k\)个非空集合的方案数。
转移的方案还是分两种情况,一种是一个球单独成一个集合,另一种是加入其它的集合,那么就有递推式:
其中\(\begin{Bmatrix} n \\ k \end{Bmatrix}\)也可以写为\(S(n,k)\)。
性质
同第一类斯特林数,第二类斯特林数也有一些简单的性质:
- \(S(0,0)=S(n,n)=1\)
- \(S(n,0)=S(0,n)=0,n>0\)
- \(S(n,n-1)=C(n,2)\)
- \(S(n,n-2)=C(n,3)+3C(n,4)\)
分两种情况然后加起来即可。
- \(S(n,2)=2^{n-1}-1\)
直接归纳证即可。还有一种比较简单的方法,就是先钦定一个球在一个盒子中,然后剩下\(n-1\)个球每个球就有两种可能,最后再减去不合法的一种情况即可。
另外,第二类斯特林数还有通项公式,可以用容斥的思想去想,即枚举至少有几个空集合,然后小球可以在其它集合中随便放。公式如下:
因为最终得到的答案考虑了集合之间的顺序,所以我们除以\(k!\)即可。
这个通项可以化为:
可以注意到这是一个卷积的形式,那么我们可以用\(NTT\)在\(O(klogk)\)的时间内快速求出\(S(n,1),S(n,2),\cdots,S(n,k)\)的通项。
第二类斯特林数还有一个比较有用的公式:
\(m^n\)意即将\(n\)个小球放入\(m\)个集合中,允许空盒。
我们可以枚举最终是几个集合,然后从将其从\(m\)中选出来并标号,最后将\(n\)个小球放入这\(i\)个盒子,所有情况加起即为\(m^n\)。
最后再附加一个公式,可以用来处理一些有关\(n!\)的信息:
我们可以几乎认为这两者相等。
七.置换群
这部分内容有点不好理解。。所以更多是直观上的阐述。
这部分知识应该是对于一类涉及“本质不同”的计数问题的补充,通常这类问题具有比较好的对称性质。
1.群
1.1 定义
给定集合\(G\)和\(G\)上的二元运算\(\cdot\),若满足下列性质则被称作群:
- 封闭性:若\(a,b\in G\),则存在\(c\in G\),使得\(a\cdot b=c\);
- 结合律:任意\(a,b,c\in G\),有\((a\cdot b)\cdot c=a\cdot (b\cdot c)\);
- 存在单位元:存在\(e\in G\),任意\(a\in G\),有\(a\cdot e = e\cdot a=a\);
- 存在逆元:对任意\(a\in G\),存在\(b\in G\),满足\(a\cdot b=e\)。
比如\(G=\{0,1,2,\cdots,n-1\}\)在\(mod\ n\)的加法下是群。
2 置换
2.1 定义
有限集合到自身的一一对应称为置换。集合\(S=\{a_1,a_2,\cdots,a_n\}\)上的置换可以表示为:
\(S\)上所有的置换的数量为\(n!\)。
2.2 循环置换
循环置换是一类特殊的置换,可表示为:
那么,任意一个置换都可以表示为若干个循环置换的乘积,这里的乘积可以理解为依次作用。
比如:
若我们将相应的映射关系看作一条有向边,那么对于一个置换来说,最终形成的图一定是由若干个环构成。
3.Burnside引理
直接给出引理内容吧:
设\(G=\{a_1,a_2,\cdots,a_g\}\)是目标集\([1,n]\)上的置换群,每个置换群可以写成若干个不相交循环置换的乘积。\(c_1(a_k)\)为置换\(a_k\)作用下不动点的个数,即长度为\(1\)的循环置换。通过上述置换变换后可以相等的元素属于同一个等价类。若\(G\)将\([1,n]\)划分为\(l\)个等价类,则有:
证明的话还需要引入一些其它的概念,比较复杂就不说了,详细证明可以参考oi-wiki。
通过\(Burnside\)引理,我们只需要找到所有置换作用下长度为\(1\)的循环置换,即可求出本质不同的方案数。
但是\(Burnside\)引理有其一定的局限性,因为我们要枚举出所有的置换结果,当问题数据规模较大时会很麻烦。
所以接下来有个更优秀的东西:
4.Polya定理
前置条件与\(Burnside\)引理相同,内容修改为:
这里\(c(a_i)\)表示的是置换\(a_i\)的循环的个数。
感性理解一下,之前我们是以具体染色图像为元素,通过其在置换作用下的不动点来求出答案。而在\(Polya\)定理当中,我们更关注的是图像的结构,若某个置换可以表示为\(x\)个循环的乘积,那么每个循环中的元素如果染色相同的话那么这就相当于一个不动点,所以对于一个置换总的不动点个数即为\(m^x\)。
总结一下,就相当于对问题进一步抽象,然后利用对称性更加方便快捷地来计算。
应用的话需要找准对于图像的每一个置换的循环的个数,我就不一一列举了~
5.母函数型Polya定理
刚才的\(Polya\)定理中,我们能求出\(m\)染色的方案,但是如果想要求出较为细致的问题,比如只用某两类颜色染色的方案,这时就需要母函数型\(Polya\)定理。
其实也没啥差别,我们将\(Polya\)定理的内容改为:
即可。
举个例子,比如对一个置换,其可以表示为\(c(1)^2c(2)^3\),即两个长度为\(1\)的循环和\(3\)个长度为\(2\)的循环,按照\(Polya\)定理,则有总方案数为\(\frac{m^5}{1}\)(因为这里只有一个置换)。
在母函数型\(Polya\)定理中,则表示为:
是不是和母函数长得很像?这里只不过是用母函数的思想来表示出那个乘积:因为任意长度为\(k\)的循环其所有元素必须染为一样的颜色,所以有个\(k\)次方;然后通过多项式乘积的形式就可以列举出所有的组合。
具体的一些应用可以看一下马昱春老师讲的组合数学,上面提到了一些比较经典的应用。
重要的是自信,一旦有了自信,人就会赢得一切。