浅谈母函数

母函数真是迷人……

59eb6654682d2.png (230×230)

定义

母函数是一个无穷级数G(x)=g0+g1x+g2x2+=i=0gixi
我们把系数g0,g1提取出来,这个系数序列与母函数存在一一对应的关系,存在双射:gG(x).
举个例子,有母函数G(x)=1+x+x2+x3,则与之对应的系数表达就是<1,1,1,1>.

基本运算

加减
F(x)+G(x)↔<f0+g0,f1+g1,f2+g2>
F(x)G(x)↔<f0g0,f1g1,f2g2>
数乘
cG(x)↔<cg0,cg1,cg2>
乘幂
xkG(x)↔<0,0,0,g0,g1>(前面放上k0
卷积
F(x)×G(x),跑FFT做多项式乘法即可。

用处

这里介绍最简单的用途。
你有一些水果,只能拿3的倍数个苹果,只能拿质数个草莓。问对于每个0<i<=n,有多少种方案使得恰好拿i个水果。
我们不妨先造出两个布尔数组,来储存“能不能拿”。
苹果:[0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1...]
草莓:[0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0...]
考虑母函数。我们尝试用xk的系数来表示k个物品的方案数。那么上面的两个布尔数组生成了两个母函数:
苹果:A(x)=x3+x6+x9
草莓:B(x)=x2+x3+x5+x7
我们把它们乘起来,就会发现一个奇妙的事情:乘积的结果,xk的系数正好表示了取k个物品的方案数。
为什么会这样?考虑x5的系数。x5可以由x0x5,x1x4,x2x3,x3x2来构成,这正好映射了“0个苹果5个草莓、1个苹果4个草莓……”的选取方式。
结合FFT,我们就可以在O(nlogn)的时间复杂度内求出0<i<=n的答案。直接输出卷积即可。
高级运算:求导
母函数可以求导。效果是把系数左移一位,然后乘上次数。
G(x)   <g0,g1,g2,g3>
G(x)  <g1,2g2,3g3>

闭形式

考虑母函数<1,1,1>,对其进行等比数列求和:
1+x+x2+x3=11x
我们称11x为母函数<1,1,1>闭形式
注意,这里忽略了收敛问题。但是这没有影响,因为我们需要使用的是系数,与x的取值始终无关。
对母函数的操作等价于对闭形式的操作。例如,我们对<1,1,1>求导:
G(x)=11x
G(x)=1(1x)2
G(x)↔<1,2,3>(之前已经算出过)
故有结论:1(1x)2↔<1,2,3>.

例题

论文题。
明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!
我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。
他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等。
当然,他又有一些稀奇古怪的限制:
每种食物的限制如下:
最多带 1 个汉堡
巧克力的块数是 5 的倍数
最多带 4 瓶矿泉水
薯片的包数是一个偶数
最多带 3 罐牛奶
糖果的个数是 4 的倍数
注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是n就算一种方案。因此,对于给出的n,你需要计算出方案数,并对10007取模。n<=10100k<=3
我们考虑为每个限制生成自己的母函数。像前面的例子一样,0代表可选择,1代表不可选择。
汉堡:<1,1,0,0,0,0>↔1+x
(只能带01个)
巧克力:<1,0,0,0,0,1,0,0,>↔11x5
(5的倍数)
矿泉水:<1,1,1,1,1,0,0>↔1x51x
(最多4瓶)
薯片:<1,0,1,0,1>↔11x2
(偶数个)
牛奶:<1,1,1,1,0,0>↔1x41x
(最多3罐)
糖果:<1,0,0,0,1,0>↔11x4
(4的倍数)
直接卷起来,最后结果化简为1(1x)3=(11x)3↔<1,1,1,1,1>3
容易用二项式定理把它重新搞成系数形式:1+C32x+C42x2+C52x3
题目需要求的是xn的系数,直接输出Cn+22即得解。

指数型母函数

泰勒展开相关。留坑待补。

Update on 2016.8.30
此坑已补。

Update on 2016.10.3
修正了一些错误。

评论

此博客中的热门博文

将博客部署到星际文件系统(IPFS)

高中地理必修一知识点总结

一场CF的台前幕后(下)