组合数学
组合数学真的非常重要啊啊啊。
排列组合
-
组合恒等式
- 对称恒等式
- 吸收恒等式
- 归纳恒等式:
-
\[\sum\limits_{i=m}^n\binom i m=\binom {n+1} {m+1} \]
用组合意义可以非常完美的解释。右边的组合数相当于你从 \(n+1\) 个球里取出 \(m+1\) 个球,但这第 \(m+1\) 个球其实相当于限制了前 \(m\) 个球选择的范围,发现就是左边的东西。证毕。
-
\[\sum\limits_{i=0}^m \binom n m \binom m {m-i}=\binom{m+n}{m}(n\geq m) \]
-
\[\binom n r \binom r k=\binom n k \binom{n-k}{r-k} \]
-
\[\sum\limits_{i=0}^n \binom {n-i} {i} =F_{n+1} \]
其中 \(F_i\) 为斐波那契数列第 \(i\) 项。考虑 \(F_i\) 的组合意义:给定 \(i-2\) 个位置,在里面放若干个球,是的球两两不相邻的方案数。而左边也可以像这样解释。
-
例题:
容斥原理
直接推荐这个,讲的非常全面。
自己总结一下,谈谈模型的建立。就是你首先要确定你要容斥的集合(包括确定元素,全集),然后每个元素都有一个属性,你要根据题目要求判断是求属性的交还是并等等,最后套用容斥公式解答。
-
集合幂级数
(Update 2020.6.6)今天问了Binary_Search_Tree神仙一个式子的推导:
\[f(S)=\sum\limits_{S\subseteq T}g(T) \Leftrightarrow g(S)=\sum\limits_{S\subseteq T}(-1)^{|T|-|S|}f(T) \]然后他就花了一个小时给我讲了集合幂级数(呜呜呜我太菜了理解了好久)。
定义
定义形如
\[f(x)=\sum\limits_{S}a_Sx^S \]为集合幂级数,其中枚举的\(S\)为集合\(\{1,2,3,4,...,n\}\)的一个子集,\(a_S\)为系数。
运算
-
加法:对应系数相加。
-
减法:对应系数相减。
-
乘法:
\[f(x)g(x)=\sum\limits_{S_1}\sum\limits_{S_2}a_{S_1}b_{S_2}x^{S_1+S_2} \]其中\(a_{S_1}\)和\(b_{S_2}\)表示对应项的系数。
- 子集卷积:
\[f(x)*g(x)=\sum\limits_{S}(\sum\limits_{S_1}\sum\limits_{S_2}[S_1\cap S_2=\varnothing][S_1 \cup S_2=S]a_{S_1}b_{S_2})x^S \]- 求逆:
两个函数的子集卷积为\(e\)
特殊集合幂级数
说白了就跟数论中一些基本函数差不多。
- \(I\):所有系数均为\(1\)
- \(e\):空集的系数为\(1\),其余系数为\(0\)
(基础知识完结撒花)
好了,bb了这么多,回到开始的那个式子上去吧。
首先我们发现一个神奇的性质:
\[I*T=e,T=\sum\limits_{S}(-1)^{|S|}x^S \]考虑它为什么成立。
证明:
\[\begin{aligned}I*T[S] &=\sum\limits_{i=1}^{|S|}\binom{|S|}{i}(-1)^i1^{|S|-i}\\&=(1-1)^{|S|}\\&=0^{|S|} \end{aligned} \]中间的推导过程使用了二项式定理。我们发现只有当\(|S|=0\)也就是\(S\)是空集时这一项的系数才为\(1\),否则为\(0\),这正是\(e\)的定义啊。
证毕。
(
所以这跟最开始的式子有什么关系)这就来啦(
式子是什么来着)\[f(S)=\sum\limits_{S\subseteq T}g(T) \Leftrightarrow g(S)=\sum\limits_{S\subseteq T}(-1)^{|T|-|S|}f(T) \]我们可以把\(f(S)\)看成一个集合幂级数(具体是啥不在乎,假设他是\(F\)),然后这个推导就变成了
\[F=G*I \Leftrightarrow G=T*F \]其中\(T\)同上文为\(I\)求逆后的结果。类似于反演,显然成立。
-
-
例题:
卡特兰数
定义卡特兰数 \(C_n\) 表示:\(n\) 个 \(0\) 和 \(n\) 个 \(1\) 组成的序列,满足任意前缀 \(0\) 的个数大于等于 \(1\) 的个数的数量。最近系统的学习了一下每个公式,从不同角度理解卡特兰数。
-
\(C_n=\binom{2n}{n}-\binom{2n}{n-1}\)
正难则反,考虑求不合法的序列个数。对于每个不合法的序列,构造一个映射:找到这个序列第一个 \(0\) 的个数小于 \(1\) 的个数 的前缀,假设这个位置为 \(i\),那么把 \(i+1\sim 2n\) 的位置去反。这样我们得到了一个有 \(n+1\) 个 \(1\),\(n-1\) 个 \(0\) 的序列,把这个序列对应上那个不合法的原序列。这样我们就有了一个一一映射,也就找到了不合法的序列个数为 \(\binom{2n}{n-1}\)。
-
\(C_n=\sum\limits_{i=0}^{n-1} C_i\times C_{n-i-1}\)
发现这就是二叉树计数。考虑二叉树计数如何对应卡特兰数的基本定义就能证明这个公式。对于一个非空节点,我们把 \(0\) 对应访问左子树,\(1\) 对应访问右子树(空子树也要进入)。然后显然这就是卡特兰数的基本定义。
-
\(C_n=\frac{C_{n-1}\times (4n-2)}{n+1}\)
考虑凸 \(n\) 边形的划分计数。考虑两种计算方法:
- 钦定一条边,枚举剩下 \(n-2\) 个点谁跟这条边组成一个三角形,\(H_n=H_{n-1}+H_{3}H_{n-2}+\cdots+H_{n-2}H_3 +H_{n-1}\),显然这样不重不漏。
- 从每个点引一条对角线,去重后答案为 \((n-3)\times H_n=n/2\times (H_3H_{n-1}+H_4H_{n-2}+\cdots + H_{n-1}H_3)\)。
第一个式子的第 \(n+1\) 项为 \(H_{n+1}=H_n+H_3H_{n-1}+\cdots +H_{n-1}H_3+H_n\)。把这个式子与第二个式子相减得:
\[H_{n+1}=(\frac {4n-6} {n})\times H_n \]然后通过某种神奇的想像我们发现 \(H_n=C_{n-2}\),于是就有:
\[C_n=\frac{4n-2}{n+1}C_{n-1} \]
斯特林数
-
基础概念
第一类斯特林数
定义第一类斯特林数 \({n\brack k}\) 表示把 \(n\) 个元素分成 \(k\) 个轮换的方案数,递推式:
\[{n\brack k}={n-1\brack k-1}+ (n-1)\times {n-1\brack k} \]第二类斯特林数
定义第二类斯特林数 \({n \brace k}\) 表示把 \(n\) 个元素分成 \(k\) 个集合的方案数,递推式:
\[{n \brace k}={n-1 \brace k-1} + k\times{n-1 \brace k} \] -
普通幂与阶乘幂的转换
下降幂转普通幂
\[x^n = \sum\limits_{k}{n \brace k}x^{\underline{k}} \]可以用归纳法证明(然鹅我看不懂),但是组合意义证明更加易懂:等式的左右相当于把 \(n\) 个球放进 \(x\) 个盒子里的方案数。
普通幂转上升幂
\[x^{\overline{n}}=\sum\limits_{k}{n\brack k}x^k \]证明留坑。
其他转换
那如果我们想要将普通幂转下降幂或上升幂转普通幂怎么办呢? 注意到这样一个事情:
\[x^{\overline{n}}=(-1)^n(-x)^{\underline{n}}\\ x^{\underline{n}}=(-1)^n(-x)^{\overline{n}} \]所以显然就有:
\[x^{\underline{n}}=\sum\limits_{k}(-1)^{n-k}{n\brack k}x^k\\ x^n=\sum\limits_{k}(-1)^{n-k}{n\brace k}x^{\overline{k}} \]