关于生成函数

基础

普通生成函数

对于数列ai,它的普通生成函数(OGF)为A(x)=aixi

这个xi刚开始并没有实际意义,即为形式幂级数,实际这个i甚至可以不是一个整数,如FWT中的指数为集合幂指数

普通生成函数常用于解决无序的组合计数问题,如背包问题

常见背包的生成函数

我们让xi项表示选择了i个物品,则可以构造生成函数

一个01背包,每一个物品的生成函数为A(x)=x+1,其中x项表示多选了一个,1项表示空着不选

同理,对于一个有限背包,每个物品上限mi,则Ai(x)=j=0mixj

一个完全背包的生成函数为A(x)=i=0xi=1x1x=11x(因为我们所求的答案是前若干项,无穷项没有意义)

那么多个物品的组合就可以通过这些生成函数相乘来轻松表示,因此也容易被多项式的快速运算优化

用生成函数描述递推关系

一个最简单的例子,设斐波那契数列的普通生成函数为F(x)

我们知道Fi=Fi1+Fi2,F0=0,F1=1

则可以用生成函数表示斐波那契数列的递推关系F(x)=xF(x)+x2F(x)+x

其中xF(x)对应递推式的Fi1x2F(x)对应递推式的Fi2x对应F1的值

类似的问题还包括数列的线性递推,即ai=bjaij,但是这个求解比较复杂。。。

 

基于概率期望的生成函数

取自 集训队论文 2018 - 1 浅谈生成函数在掷骰子问题上的应用长沙市长郡中学杨懋龙

对于随机非负离散变量x,令它的概率生成函数是F(z)=i=0P(x=i)zi,则可以看到这里的指数代表x的值

x的值不一定能够相加,但是利用这个生成函数,可以快速表达期望,方差等,具体见下式

1.F(1)=i=0P(x=i)=1

2.F(1)=i=0P(x=i)i=E(x)

3.E(xk_)=F(k)(1) (xk阶下降幂,(k)表示k阶导数)

4.x的方差=i=0P(x=i)(iE(x))2=i=0P(x=i)i22P(x=i)iE(x)+P(x=i)E2(x)

=E(x2)2E2(x)+E2(x)=E(x2)E2(x)=E(x2_)+E(x)E2(x)=F(1)+F(1)(F(1))2

可以作为导数在生成函数推导中应用的一个例子

 

指数生成函数

对于数列ai,它的指数生成函数(EGF)为A(x)=aixii!

指数型生成函数是处理有序排列问题的一大利器,因此,指数上的i通常表示个数

为什么1i!可以简化排列问题,可以参见这样的一个例子

用若干类物品排成一个排列,每一类有mi个,则不同的排列个数为 (mi)!mi!

这个式子的意义就是: 假设先随便排列,由于每一类相同,因此类之内的排列都要除掉

可以看到,1i!描述的就是类内的排列,因此最后求得答案项还要乘上n!

如果一类物品任意个数加入排列,则其指数生成函数为A(x)=i=0xii!=ex

根据ex=i(x)ii!,还能得到:

限制为偶数个的指数生成函数A(x)=2|ixii!=ex+ex2

限制为奇数个的指数生成函数A(x)=2|ixii!=exex2

限制为n的倍数个,较为复杂,需要用到单位根反演

ex在排列问题叠加上的应用

若有一类等价排列子问题,其指数型生成函数为F(x),则任意叠加其得到的排列问题指数型生成函数为

i=0Fi(x)i!=eF(x),其中1i!表示除去子问题之间等价

 

更多常用技巧

1.分治NTT解决多个多项式卷积问题

2.CDQ分治NTT解决有序递推问题

 

3.推导生成函数的关系

3-1.树的递归关系

问题: 计算合法树的数量,如树上染色问题等

这一类问题可以表示为 一种递归关系,即 枚举根的状态 加上根的儿子对应的生成函数

例子 [Codeforces Round #250]小朋友和二叉树

设一个点的生成函数为G,整棵数的生成函数为F,其中幂指数代表权值和,则G是我们已知的,且有关系

F=GF2+1,其中F2表示枚举两个子树的状态,G表示枚举根的状态,+1表示空树

类似这样的问题还有 烷基计数加强版加强版 这个方程要用到牛顿迭代求解

3-2.

 

4.集合幂指数在处理01状态上的应用

如果用整数指数形式表示的生成函数解决01状态上的or,and,xor操作

我们通常需要把这个过程转化为对0,1个数来做

但是这一类的问题,通常可以用集合幂指数轻松表示,前提是你了解FWT卷积三种类型的本质过程

例题 ZJOI 2019开关