组合数学 学习笔记
原本觉得搞OI的时候组合计数还不算太弱,但现在已经完全不会了,,稍微补救一下
卡特兰数
组合意义
n个节点二叉树的形态个数(还有很多其他的形式)
(今天数据结构课上老师问了这个问题,然后我解了个生成函数发现不会化开根号,也忘记这是卡特兰数了)
计算
通过递推式可以列出生成函数,然后解一个二次方程,用广义二项式定理展开一下,经过化简后得到\(H(n)=\frac{C^n_{2n}}{n+1}\)
第二类斯特林数
组合意义
n个有标号的数分为k个无标号的集合的方案数
计算
递推
由组合意义可知:\(S(n,k)=S(n-1,k-1)+kS(n-1,k)\)
通项
考虑万能的容斥原理,枚举至少有i个空集,注意到有空集之后就很难按照无标号做了(因为如果没有空集,那每个集合互相不同,就很好处理,反之就很麻烦);那就先按照有标号做,到最后再除掉\(k!\)(容斥完之后已经保证了没有空集)
一行(即\(S(n,i)\))
直接用通项公式卷积计算即可。
第一类斯特林数
组合意义
n个有标号的数分为k个无标号的环排列的方案数
计算
递推
由组合意义可知:\(S(n,k)=S(n-1,k-1)+(n-1)S(n-1,k)\)
通项
第一类斯特林数没有实用的通项公式。
——OI-wiki
一行(即\(S(n,i)\))
通过递推式列生成函数,发现是n个多项式的乘积,可以分治fft;上升幂相关做法(?)可以做到一个log
一列(即\(S(i,k)\))
因为n个数是有标号的,故考虑EGF(直观来说,从左往右考虑一段段数生成环排列,如果数无标号就是OGF,有标号就每生成一段多乘一个组合数,就是EGF)
容易得出一个环排列以排列长度为下标的生成函数,然后取k次幂即可。
浙公网安备 33010602011771号