关于生成函数
关于生成函数
基础
普通生成函数
对于数列,它的普通生成函数()为
这个刚开始并没有实际意义,即为形式幂级数,实际这个甚至可以不是一个整数,如中的指数为集合幂指数
普通生成函数常用于解决无序的组合计数问题,如背包问题
常见背包的生成函数
我们让项表示选择了个物品,则可以构造生成函数
一个01背包,每一个物品的生成函数为,其中项表示多选了一个,1项表示空着不选
同理,对于一个有限背包,每个物品上限,则
一个完全背包的生成函数为(因为我们所求的答案是前若干项,无穷项没有意义)
那么多个物品的组合就可以通过这些生成函数相乘来轻松表示,因此也容易被多项式的快速运算优化
用生成函数描述递推关系
一个最简单的例子,设斐波那契数列的普通生成函数为
我们知道
则可以用生成函数表示斐波那契数列的递推关系
其中对应递推式的,对应递推式的,对应的值
类似的问题还包括数列的线性递推,即,但是这个求解比较复杂。。。
基于概率期望的生成函数
取自 集训队论文 2018 - 1 浅谈生成函数在掷骰子问题上的应用长沙市长郡中学杨懋龙
对于随机非负离散变量,令它的概率生成函数是,则可以看到这里的指数代表的值
的值不一定能够相加,但是利用这个生成函数,可以快速表达期望,方差等,具体见下式
1.
2.
3. (的阶下降幂,()表示阶导数)
4.的方差
可以作为导数在生成函数推导中应用的一个例子
指数生成函数
对于数列,它的指数生成函数()为
指数型生成函数是处理有序排列问题的一大利器,因此,指数上的通常表示个数
为什么可以简化排列问题,可以参见这样的一个例子
用若干类物品排成一个排列,每一类有个,则不同的排列个数为
这个式子的意义就是: 假设先随便排列,由于每一类相同,因此类之内的排列都要除掉
可以看到,描述的就是类内的排列,因此最后求得答案项还要乘上
如果一类物品任意个数加入排列,则其指数生成函数为
根据,还能得到:
限制为偶数个的指数生成函数
限制为奇数个的指数生成函数
限制为的倍数个,较为复杂,需要用到单位根反演
在排列问题叠加上的应用
若有一类等价排列子问题,其指数型生成函数为,则任意叠加其得到的排列问题指数型生成函数为
,其中表示除去子问题之间等价
更多常用技巧
1.分治NTT解决多个多项式卷积问题
2.CDQ分治NTT解决有序递推问题
3.推导生成函数的关系
3-1.树的递归关系
问题: 计算合法树的数量,如树上染色问题等
这一类问题可以表示为 一种递归关系,即 枚举根的状态 加上根的儿子对应的生成函数
例子 [Codeforces Round #250]小朋友和二叉树
设一个点的生成函数为,整棵数的生成函数为,其中幂指数代表权值和,则是我们已知的,且有关系
,其中表示枚举两个子树的状态,表示枚举根的状态,表示空树
类似这样的问题还有 烷基计数加强版加强版 这个方程要用到牛顿迭代求解
3-2.
4.集合幂指数在处理01状态上的应用
如果用整数指数形式表示的生成函数解决01状态上的or,and,xor操作
我们通常需要把这个过程转化为对个数来做
但是这一类的问题,通常可以用集合幂指数轻松表示,前提是你了解卷积三种类型的本质过程