指数生成函数
指数生成函数(Exponential generating function,EGF)定义为
F^(x)=i≥0∑aii!xi
指数生成函数的运算不是简单的卷积:
F^(x)G^(x)=i≥0∑j≥0∑aibji!j!xi+j=k≥0∑i=0∑kaibk−ii!(k−i)!xk=k≥0∑i=0∑k(ik)aibk−ik!xk
因此序列ai和bi的指数生成函数的积得到的是∑j=0i(ji)aibi−j的指数生成函数。这在一些有标号的计数中会很有用。
常用封闭形式
首先有ex的泰勒展开式:
G^(x)=i≥0∑i!xi=ex
那么简单拓展为e−x:
G^(x)=i≥0∑i!(−x)i=i≥0∑(−1)ii!xi
这两个可以拓展出奇数和偶数阶乘的封闭形式。
置换环与圆排列
考虑 n 个元素的排列数pn=n!的指数生成函数:
P^(x)=n≥0∑n!n!xn=1−x1
另一方面,n个元素的圆排列排列数qn=(n−1)!的指数生成函数:
Q^(x)=n≥0∑(n−1)!n!xn=−ln(1−x)=ln(1−x1)
这两者有什么联系?容易发现,(置换)排列可以理解为是若干个环(置换环)的集合。而这些环之间的顺序我们不考虑。因此expQ^可以理解为是若干个带标号的圆排列组合在一起的方案数的指数生成函数,即P^。反之,lnP^则相当于把构成方案分成若干个具有相同性质的部分,这些部分的生成函数。
另一方面,这也解释了exp和ln的组合意义,这在求一些生成函数的时候会非常有用。
拓展
错排数的生成函数?
直接用容斥的式子似乎不太好做。考虑其组合意义就是置换环大小大于 1 的置换数量。那么我们把圆排列数的x这一项去掉,然后exp回去即可:
F^(x)=exp(Q^(x)−x)=exp(ln(1−x1)−x)=1−xe−x
有标号简单连通无向图计数
题目链接:城市规划。
求出有n(n≤130000)个点的有标号简单连通无向图的个数。
算法一
设f(n)表示n个点简单无向连通图的个数,g(n)表示n个点的图的个数。那么
g(n)=2(2n)
且
g(n)=i=1∑n(i−1n−1)f(i)g(n−i)
化简得到
(n−1)!g(n)=i=1∑n(i−1)!f(i)(n−i)!g(n−i)
我们定义三个生成函数
F(x)G(x)H(x)=i≥1∑(i−1)!f(i)xi=i≥0∑i!g(i)xi=i≥1∑(i−1)!g(i)xi
那么显然可以得到H=FG(modxn+1),那么F=HG−1(modxn+1),多项式求逆即可。
最后算完了别忘了把阶乘乘回去。
算法二
设g(i)表示i个点的简单无向图的个数,f(i)表示i个点简单无向连通图的个数。对应的指数生成函数为
G^(x)=i≥0∑g(i)i!xiF^(x)=i≥0∑f(i)i!xi
其中
g(i)=2(2i)
我们尝试用F^表示G^。考虑[xn]F^i(x)表示的含义。它表示n个点分成i个连通块的“排列数”。因为在分的过程中我们是钦定了连通块之间的顺序(这是 EGF 乘法运算的组合意义)。因此还需要除以i!才能得到n个点分成i个连通块的图的个数。因此得到
G^(x)=i≥0∑i!F^i(x)
因此G^(x)=expF^(x),那么F^(x)=lnG^(x)。
有标号二分图计数
首先考虑二分染色图计数。所谓二分染色图指区分左右部的二分图。这个比较简单:
fn=i=0∑n(in)2(n−i)i
设其对应的 EGF 为F(x)。根据ab=(2a+b)−(2a)−(2b),我们可以很容易将F表示为卷积的形式。
然后我们考虑将二分染色图个数转化为二分图个数。若连通块个数为k的二分染色图为t,那么连通块个数为k的二分图个数为2kt。这启发我们利用连通二分图的个数建立关系。
假设二分图个数的 EGF 为G(x),则连通二分图的个数的 EGF 显然为lnG(x)。于是连通的二分染色图个数为2lnG(x),于是
2lnG=lnF
因此G=F。使用多项式开根即可。
TJOI2015 概率论
设h(i)表示i个结点的二叉树总数,f(i)表示i个结点的二叉树的叶子结点数的和。
容易发现h(i)=∑j=0i−1h(j)h(i−j−1)是卡特兰数。类似地可以得到
f(i)=2j=1∑i−1f(j)h(i−j−1)(i≥2)
其中f(0)=0,f(1)=1。类似地,设F(x)=∑i≥0f(i)xi,那么得到
F(x)=i≥0∑f(i)xi=x+2i≥2∑j=1∑i−1f(j)h(i−j−1)xjxi−j−1x=x+2xj≥1∑f(j)xji≥0∑h(i)xi=x+2xF(x)C(x)
代入C(x)=2x1−1−4x解得
F(x)=1−4xx
用牛顿二项式展开得到
(1−4x)−21=i≥0∑(i−21)(−4x)i=i≥0∑4ii!i!(−1)i(2i)!(−4x)i=i≥0∑(i2i)xi
那么带回原式得到
F(x)=i≥1∑(i−12i−2)xi
根据卡特兰数的生成函数
C(x)=i≥0∑i+11(i2i)xi
对应项相除可以得到
[xn]C(x)[xn]F(x)=n+11(n2n)(n−12n−2)=2(2n−1)n(n+1)
答案即所求。
POJ3734 Blocks
容易得到生成函数为
e2x(2ex+e−x)2=4e4x+2e2x+1
那么展开得到
G^(x)=1+i≥1∑(4i−1+2i−1)i!xi
51nod1728 不动点
题意:求有多少个映射f:{1,2,⋯,n}→{1,2,⋯,n},使得◯i=1kf=◯i=1k−1f。(这个大圈表示复合)
nk≤2×106,k≤3。
可以发现,我们要求的是n个点带标号的深度不超过k的有根树森林计数。
设F^k(x)表示答案的指数生成函数。显然F^1(x)=ex。
设[xn]G^k(x)表示n个点深度不超过k的有根树的方案数。G^k(x)是指数生成函数。显然G^1(x)=x。考虑G^k(x)的递推式,可以得到[xn]G^k(x)=n[xn−1]F^k−1(x)。整理一下得到G^k(x)=xF^k−1(x)。
于是得到F^k(x)=expG^k(x)=exp(xF^k−1(x))。
注意这题卡常,可以根据nk≤2×106合理设置长度来卡常。
CF891 E
设ai减少的值是bi,那么题目相当于要求E(∏ai−∏(ai−bi))=∏ai−E(∏(ai−bi))。
对于后者,乘上一个nk转化为计数问题:
E=nk1∑bi=k∑∏bi!k!i=1∏n(ai−bi)=nkk!∑bi=k∑i=1∏nbi!ai−bi
构造生成函数,对于bi!ai−bi可以构造∑j≥0j!ai−j,那么就可以构造一个 OGF:
F(x)=i=1∏nj≥0∑j!ai−jxj
虽然这是一个 OGF,但是我们是可以把它当 EGF 来用的。因此做一下化简:
F(x)=i=1∏nj≥0∑j!ai−jxj=i=1∏n(aiex−xex)=enxi=1∏n(ai−x)
我们直接O(n2)求出G(x)=∏i=1n(ai−x)的系数,记为ci。那么可以得到
F(x)=enxG(x)=i≥0∑i!(nx)ij≥0∑cjxj=i≥0∑i!nixij≥0∑cjxj=k≥0∑xki=0∑ki!nick−i
期望为
nkk![xk]F(x)=i=0∑knikici=i=0∑min(n,k)nikici
答案为
i=1∏nai−i=0∑min(n,k)nikici
小朋友与二叉树
考虑G(x)=∑i=1nxci。设答案的 OGF 为F(x)。那么可以列出方程
F=F2G+1
解得
F=2G1±1−4G=1∓1−4G2
取x=0,由于分母常数项不能为 0,因此舍掉负根,得到
F(x)=1+1−4G(x)2
多项式求逆、幂函数即可([x0]F(x)=1)。
分拆数
分拆数(拆分数,划分数)的生成函数为
P(x)=i≥1∏(j≥0∑xij)
算法一
利用所学知识,我们来化简一下该生成函数:
P(x)=i≥1∏1−xi1
两边同时ln得到
lnP(x)=lni≥1∏1−xi1=i≥1∑ln1−xi1=−i≥1∑ln(1−xi)=i≥1∑j≥1∑jxij=i≥1∑xij∣i∑j1
那么我们O(nlogn)预处理lnP(x),再exp回去即可。时间复杂度O(nlogn)。但常数较大。
算法二
首先介绍一下五边形数:pn=21n(3n−1),n∈N。
对于广义五边形数,n∈Z。容易证明,pn≥0(n∈Z)。
接下来介绍欧拉函数(复变函数),其定义为
ϕ(x)=i≥1∏(1−xi)
与之相关的是五边形定理,它描述了五边形数与欧拉函数的关系:
ϕ(x)=n=−∞∑∞(−1)nxpn
另外还有一个性质,欧拉函数的倒数是分拆数的生成函数:
ϕ−1(x)=n≥0∑P(n)xn
于是直接求即可。求ϕ(x)modxn的复杂度是O(n)的,多项式求逆复杂度O(nlog2n)。总复杂度O(nlog2n)。