[学习笔记]组合数学入门1-组合数/组合恒等式/卡特兰数

组合数学

组合数

多重组合数(其实指的是多重集的排列数\(\begin{aligned}\binom{n}{n_1,n_2,\dots,n_k}=\frac{n!}{n_1!\dots n_k!}\end{aligned}\),其中保证的是\(\sum n_i=n\),多项式展开的第\(K\)项系数即为\(\begin{aligned}\sum_{n_1+\dots n_k=K}\binom{K}{n_1,\dots,n_k}\end{aligned}\),平常的二项式系数也就对应着二重集的情况。

多重集的组合数就会比较复杂,前面只是\(n\)\(k\)种元素排一排,现在我们是选出\(r\)个来排,如果\(r\)比所有的\(n_i\)都小的话,那每种的物品都随便选,相当于\(\sum^k x_i=r\)有多少非负整数解,那就是隔板法\(\begin{aligned}\binom{r+k-1}{k-1}\end{aligned}\)

接着,对于\(r\geq\)某些个\(n_i\)的情况来说,考虑\(S_i\)为满足某个\(x_i\leq n_i\)集合:

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

\(\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}\)

不相邻排列

\(1,2,\dots,n\)\(k\)个,任意两个不相邻的方案数:倒着想,考虑往\(n-k\)个球的\(n-k+1\)个空里面塞\(k\)个球,最后给它们标上号,方案就是我们要的\(\begin{aligned}\binom{n-k+1}{k}\end{aligned}\)

另一种是考虑一个符合条件的序列对应着排完序之后,任意两个相邻元素相差至少为2,考虑其差分序列有多少种可能,进一步考虑这样的序列:\(b_1=1,b_3,b_5,b_7\dots,b_{2k-1} =2\),然后在\(b_2,b_4,\dots,b_{2k}\)一共\(k\)个位置填上0到\(n\)的数字,\([1,2k]\)的前缀和就对应着一个\(a_k\),这个序列之和要不超过\(n\)。进一步变成再在最后一个位置加一个空,这里塞0到\(n\)的数字使得这么多数字之和恰好是\(n\)。于是变成\(k+1\)\([0,n]\)的数之和要凑成\(n-2k+1\),那就经典隔板法,答案\(\begin{aligned}\binom{(n-2k+1)+(k+1)-1}{(k+1)-1}=\binom{n-k+1}{k}\end{aligned}\).

错排

\(n\)个的答案为\(D(n)\),假设第\(n+1\)个信箱还是放第\(n+1\)封信,对于\(n+1\)的情况考虑两种转移:①前\(n\)个信封全都装错。②前\(n\)个信封有且仅有一个信封没错,除此之外不会有别的可能能够一步转移\(D(n)\),第一种的方案数是\(nD(n)\)(前\(n\)个和\(n+1\)换都能得到一个新的错排)。第二种情况则是选择那个“没错的”信封,和它交换,而这个没错的位置也有\(n\)种,方案数\(nD(n-1)\)

于是\(D(n+1)=n(D(n)+D(n-1))\)

圆排列

\(n\)个人选\(r\)个人出来,围一圈的排列数,无非就是破环成链\(Q_n^r=\frac{n!}{r(n-r)!}\),如果\(n\geq 2\)并且不考虑顺逆时针的话,方案数再除个2.

组合数恒等式

首先是\(\begin{aligned}\binom{n}{k}=\frac{n^\underline{k}}{k!}\end{aligned}\)\(n\)可以是任意实数,然后\(k\)一般认为是非负整数,如果\(k<0\)整个定义为0.

根据定义给出的对称恒等式:\(\begin{aligned}\binom{n}{k}=\frac{n}{k}\binom{n-1}{k-1}\end{aligned}\).

进一步可以得到类似于\(\begin{aligned}\binom{n}{k}=\binom{n}{n-k}=\frac{n}{n-k}\binom{n-1}{k}\end{aligned}\)\(\begin{aligned}(n-k)\binom{n}{k}=n\binom{n-1}{k}\end{aligned}\)当然这用定义也很好推)

接着比较有用的是一些求和式子,比如\(\begin{aligned}\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}\end{aligned}\),对这个式子不断展开:

一种是每次把\(k-1\)那个二项式系数展开,这会得到\(\begin{aligned}\sum_{k=0}^n\binom{r+k}{k}=\binom{r+n+1}{n}\end{aligned}\)

另一种是每次把\(k\)的拿一个二项式系数展开,这样最后得到的是一串下指标一样的东西:

\(\begin{aligned}\sum_{k=0}^n\binom{k}{m}=\binom{n+1}{m+1}\end{aligned}\),对应着组合意义:右边是从\(n+1\)个数里选\(m+1\)个出来,左边是枚举最大值为\(k+1\)的情况下的方案数。

对于上指标是负数的情况一般有如下转化:\(\begin{aligned}\binom{n}{k}&=n(n-1)\dots(n-k+1)=(-1)^k(-n)(-n+1)\dots(-n+k-1)\\&=(-1)^k(-n+k-1)^\underline{k}=(-1)^k\binom{-n+k-1}{k}\end{aligned}\)

也就是\(C(n,k)\)化成\(C(-n+k-1,k)\)相关的式子,一般叫上指标反转(加了个负号嘛),遇到\((-1)^k\)这种形式的时候经常可以用得上:\(\begin{aligned}(-1)^k\binom{n}{k}=\binom{-n+k-1}{k}\end{aligned}\)

比如我们算\(\begin{aligned}\sum_{k=0}^m \binom{n}{k}(-1)^k=\sum_{k=0}^m \binom{-n+k-1}{k}=\binom{-n+m}{m}{}\end{aligned}\),最后一步利用了之前的求和式子,当然这个还能进一步化成\(\begin{aligned}\binom{-n+m}{m}=(-1)^m\binom{n-1}{m}\end{aligned}\)

卡特兰数

非常经典的东西,比如\(2n\)个括号的括号序列合法的方案数,\(n\)个元素合法的出入栈方案数,从\((0,0)\)走到\((n,n)\)始终保持\(x\leq y\)的方案数,+1和-1组成的序列中所有前缀和非负,并且总和为0的方案数…

他们的方案数都是\(\begin{aligned}H_n=\frac{\binom{2n}{n}}{n+1}=\binom{2n}{n}-\binom{2n}{n-1}\end{aligned}\)

$ H_n = \begin{cases} \sum_{i=1}^{n} H_{i-1} H_{n-i} & n \geq 2, n \in \mathbf{N_{+}}\ 1 & n = 0, 1 \end{cases} $

也经常写成\(\begin{aligned}H_{n+1}=\sum _{i=0}^n H_i H_{n-i}=H_0 H_n+\dots+H_n H_0\end{aligned}\)

当然也有递推式:\(\begin{aligned} H_n = \frac{H_{n-1} (4n-2)}{n+1} \end{aligned}\)

前几项

\(H_0\) \(H_1\) \(H_2\) \(H_3\) \(H_4\) \(H_5\) \(H_6\)
\(1\) \(1\) \(2\) \(5\) \(14\) \(42\) \(132\)

关于证明,一种说明的方法是考虑所有+1,-1组成的,并且和为0的序列,考虑每个不合法的集合跟另一个集合的映射关系:像是+1,-1,-1,+1,-1,+1,找到他第一个前缀小于0的位置\(2k+1\),这意味着\([1,2k+1]\)内有\(k+1\)个-1,以及\(k\)个+1,同时\([2k+2,n]\)内有\(n-k\)个+1和\(n-k-1\)个-1,然后把\([1,2k+1]\)这一段序列取反,新的序列有\(k+1+n-k=n+1\)个+1,以及\(k+n-k-1=n-1\)个-1。

接着不难证明,任何一个非法序列都对应着一个由\(n+1\)\(+1\)\(n-1\)\(-1\)组成的序列。

于是\(\begin{aligned}H_n=\binom{2n}{n}-\binom{2n}{n-1}\end{aligned}\)

模型

\(n+1\)个叶节点的满二叉树

首先不难证明,\(n+1\)个叶节点的满二叉树,边一共有\(2n\)条,我们考虑任意一颗这样的二叉树从树根开始dfs,并且先左后右,同时对应一个序列,往左的时候+1,往右的时候-1。因为是满二叉树,所以一定是前缀和非负,且总和为0。

同时每个这样的序列也对应这样的树。

\(n+1\)个叶节点的满二叉树的个数为\(H_n\)

栈/+1,-1交替序列/合法括号序列/单调网格路径:

\(n\)个元素合法的出入栈序列,任意前缀和非负且总和为0的+1,-1序列,\(n\)对括号的合法括号序列,\(n\times n\)的网格,从\((1,1)\)\((n,n)\)的所有路径里,所有点都位于或高于主对角线的路径。

方案数都是卡特兰数\(H_n\)

带标号的凸多边形,三角形分割的方案数\(f_2=f_3=1,f_4=2\),对于更一般地情况,考虑先按顺序给顶点编号成\(1\)\(n\),考虑选择多边形上的任意一条边\(V_k V_{k+1}\),它一定会被分割成为某个三角形的一条边,那我们考虑这个三角形的另一个点可以是所有剩余的\(n-2\)个点,同时这一刀下去就把\(n\)边形分成了一个三角形,以及两个凸多边形。

于是给出递推式\(\begin{aligned}f_n=f_2 f_{n-1}+f_3 f_{n-2}+\dots+f_{n-1}f_2=\sum_{i=2}^{n-1} f_{i} f_{n-i+1}\end{aligned}\)

然后取\(g_{n-2}=f_{n}\),则\(f_{n}=g_{n-2}=g_0 g_{n-3}+\dots g_{n-3} g_0\),又\(g_0=g_1=f_2=f_3=1\),这就是卡特兰数\(f_n=g_{n-2}=H_{n-2}\)

圆上\(2n\)个有序的点,\(n\)条线连接所有点对,使得线两两不相交的方案数:

(另一个有意思的场景是说,\(2n\)个人围一桌,有多少种可以让每个人同时和别人握手)

类似上面多边形三角分割的方案数,随便拿一个点出来考虑它和谁握手,然后把剩下\(2n-2\)个点分割成两个部分,而且每个部分必须是偶数个点,于是记\(H_n\)是规模为\(2n\)的问题,\(\begin{aligned}H_n=H_0H_{n-1}+H_{1}H_{n-2}+\dots +H_{n-1}H_0\end{aligned}\)

生成函数

\(\begin{aligned}f(z)=H_0+H_1 z+H_2 z^2+\dots\end{aligned}\)

能用递推式推出通项,懒得写了。

posted @ 2021-05-28 20:09  yoshinow2001  阅读(828)  评论(0)    收藏  举报