组合数学真的非常重要啊啊啊。
排列组合
-
组合恒等式
- 对称恒等式
- 吸收恒等式
- 归纳恒等式:
-
[sumlimits_{i=m}^ninom i m=inom {n+1} {m+1} ]
用组合意义可以非常完美的解释。右边的组合数相当于你从 (n+1) 个球里取出 (m+1) 个球,但这第 (m+1) 个球其实相当于限制了前 (m) 个球选择的范围,发现就是左边的东西。证毕。
-
[sumlimits_{i=0}^m inom n m inom m {m-i}=inom{m+n}{m}(ngeq m) ]
-
[inom n r inom r k=inom n k inom{n-k}{r-k} ]
-
[sumlimits_{i=0}^n inom {n-i} {i} =F_{n+1} ]
其中 (F_i) 为斐波那契数列第 (i) 项。考虑 (F_i) 的组合意义:给定 (i-2) 个位置,在里面放若干个球,是的球两两不相邻的方案数。而左边也可以像这样解释。
-
例题:
容斥原理
直接推荐这个,讲的非常全面。
自己总结一下,谈谈模型的建立。就是你首先要确定你要容斥的集合(包括确定元素,全集),然后每个元素都有一个属性,你要根据题目要求判断是求属性的交还是并等等,最后套用容斥公式解答。
-
集合幂级数
(Update 2020.6.6)今天问了Binary_Search_Tree神仙一个式子的推导:
[f(S)=sumlimits_{Ssubseteq T}g(T) Leftrightarrow g(S)=sumlimits_{Ssubseteq T}(-1)^{|T|-|S|}f(T) ]然后他就花了一个小时给我讲了集合幂级数(呜呜呜我太菜了理解了好久)。
定义
定义形如
[f(x)=sumlimits_{S}a_Sx^S ]为集合幂级数,其中枚举的(S)为集合({1,2,3,4,...,n})的一个子集,(a_S)为系数。
运算
-
加法:对应系数相加。
-
减法:对应系数相减。
-
乘法:
[f(x)g(x)=sumlimits_{S_1}sumlimits_{S_2}a_{S_1}b_{S_2}x^{S_1+S_2} ]其中(a_{S_1})和(b_{S_2})表示对应项的系数。
- 子集卷积:
[f(x)*g(x)=sumlimits_{S}(sumlimits_{S_1}sumlimits_{S_2}[S_1cap 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=sumlimits_{S}(-1)^{|S|}x^S ]考虑它为什么成立。
证明:
[egin{aligned}I*T[S] &=sumlimits_{i=1}^{|S|}inom{|S|}{i}(-1)^i1^{|S|-i}\&=(1-1)^{|S|}\&=0^{|S|} end{aligned} ]中间的推导过程使用了二项式定理。我们发现只有当(|S|=0)也就是(S)是空集时这一项的系数才为(1),否则为(0),这正是(e)的定义啊。
证毕。
(
所以这跟最开始的式子有什么关系)这就来啦(
式子是什么来着)[f(S)=sumlimits_{Ssubseteq T}g(T) Leftrightarrow g(S)=sumlimits_{Ssubseteq 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=inom{2n}{n}-inom{2n}{n-1})
正难则反,考虑求不合法的序列个数。对于每个不合法的序列,构造一个映射:找到这个序列第一个 (0) 的个数小于 (1) 的个数 的前缀,假设这个位置为 (i),那么把 (i+1sim 2n) 的位置去反。这样我们得到了一个有 (n+1) 个 (1),(n-1) 个 (0) 的序列,把这个序列对应上那个不合法的原序列。这样我们就有了一个一一映射,也就找到了不合法的序列个数为 (inom{2n}{n-1})。
-
(C_n=sumlimits_{i=0}^{n-1} C_i imes C_{n-i-1})
发现这就是二叉树计数。考虑二叉树计数如何对应卡特兰数的基本定义就能证明这个公式。对于一个非空节点,我们把 (0) 对应访问左子树,(1) 对应访问右子树(空子树也要进入)。然后显然这就是卡特兰数的基本定义。
-
(C_n=frac{C_{n-1} imes (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) imes H_n=n/2 imes (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}) imes H_n ]然后通过某种神奇的想像我们发现 (H_n=C_{n-2}),于是就有:
[C_n=frac{4n-2}{n+1}C_{n-1} ]
斯特林数
-
基础概念
第一类斯特林数
定义第一类斯特林数 ({nrack k}) 表示把 (n) 个元素分成 (k) 个轮换的方案数,递推式:
[{nrack k}={n-1rack k-1}+ (n-1) imes {n-1rack k} ]第二类斯特林数
定义第二类斯特林数 ({n race k}) 表示把 (n) 个元素分成 (k) 个集合的方案数,递推式:
[{n race k}={n-1 race k-1} + k imes{n-1 race k} ] -
普通幂与阶乘幂的转换
下降幂转普通幂
[x^n = sumlimits_{k}{n race k}x^{underline{k}} ]可以用归纳法证明(然鹅我看不懂),但是组合意义证明更加易懂:等式的左右相当于把 (n) 个球放进 (x) 个盒子里的方案数。
普通幂转上升幂
[x^{overline{n}}=sumlimits_{k}{nrack k}x^k ]证明留坑。
其他转换
那如果我们想要将普通幂转下降幂或上升幂转普通幂怎么办呢? 注意到这样一个事情:
[x^{overline{n}}=(-1)^n(-x)^{underline{n}}\ x^{underline{n}}=(-1)^n(-x)^{overline{n}} ]所以显然就有:
[x^{underline{n}}=sumlimits_{k}(-1)^{n-k}{nrack k}x^k\ x^n=sumlimits_{k}(-1)^{n-k}{nrace k}x^{overline{k}} ]