普通生成函数(Ordinary Generating Function)
五个小练习:对于每个序列 a 求出它的 OGF 封闭形式。
aF(x)F(x)−xF(x)(1−x)F(x)F(x)=[0,1,1,1,1,…]=i=0∑∞xiai=i=1∑∞xi=x=x=1−xx
aF(x)F(x)−x2F(x)(1−x2)F(x)F(x)=[1,0,1,0,1,…]=i=0∑∞xiai=i=0∑∞x2i=i=0∑∞(x2)i=1=1=1−x21
aF(x)F(x)−xF(x)F(x)−xF(x)F(x)=[1,2,3,4,…]=i=0∑∞xiai=i=0∑∞(i+1)xi=i=0∑∞xi=1−x1=(1−x)21
aiF(x)=(im)=i=0∑∞xiai=i=0∑m(im)xi=i=0∑m(im)xi1m−i=(x+1)m
am,iFm(x)=(im+i)=i=0∑∞xiam,i=i=0∑∞xi(im+i)=i=0∑∞j=0∑ixi(jm+j−1)=i=0∑∞j=0∑∞xi+j(jm+j−1)=(i=0∑∞xi)(j=0∑∞xj(jm+j−1))=1−xFm−1(x)=(1−x)m+11
现在我们考虑用生成函数推导斐波那契数列的通项:
a0=0,a1F(x)(1−x−x2)F(x)F(x)=1,ai=ai−1+ai−2=i=0∑∞xiai=x=1−x−x2x
这样只是求出了封闭形式,但是这还不够,我们需要求出它每一项的系数。考虑把他给拆成两个等比数列的和,其中 A,B 表示首项,而 a,b 表示公比。
1−x−x2x=1−axA+1−bxB
通分:
∵1−x−x2x=1−ax−bx+abx2A+B−Abx−Bax∴⎩⎪⎪⎪⎨⎪⎪⎪⎧A+B=0Ab+Ba=−1a+b=1ab=−1∵{a+b=1ab=−1(a,b>0)∴ a−a1a2−a−1=1=0∴a=21+5,b=21−5∵{A+B=0Ab+Ba=−1∴ Ab−AaAa−AbA(a−b)A5AB=−1=1=1=1=51=−51⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧A=51B=−51a=21+5b=21−5
最后我们可以把这个东西往回带并求出形式幂级数,从而得到每一项的系数,即通项。
F(x)F(x)=i=0∑∞51(21+5x)i−51(21−5x)i=i=0∑∞xi51⎝⎛(21+5)i−(21−5)i⎠⎞
所以我们得到斐波那契数列的通项是 Fibi=51((21+5)i−(21−5)i)。
这个题显然可以暴力推生成函数,对于每个食物都构造出生成函数,乘起来就可以得到通项。
第一个:∑i=0∞x2i=1−x21。
第二个:1−x1−x2。
第三个:1−x1−x3。
第四个:∑i=0∞x2i+1=1−x2x。
第五个:∑i=0∞x4i=1−x41。
第六个:1−x1−x4。
第七个:1−x1−x2。
第八个:∑i=0∞x3i=1−x31。
乘起来之后变成以下形式:
(1−x)4(1−x2)2(1−x3)(1−x4)x(1−x2)2(1−x3)(1−x4)=(1−x)4x
转化成展开形式:
i=0∑∞xi×x(ii+3)i=1∑∞xi(i−1i+2)
则答案为 (n−1n+2)=(3n+2)。
显然,答案的生成函数为:
i=1∏n1−x1−xmi=(1−x)n1i=1∏n1−xmi=i=0∑∞xi(in+i−1)j=1∏n1−xmj=i=0∑∞xi(in+i−1)j=0∑∞xjcj=j=0∑∞xjcji=0∑∞xi(in+i−1)
然后,cj 是可以直接 O(2n) 暴力展开求的,然后答案即为:
j=0∑bcji=a−j∑b−j(in+i−1)=j=a∑bcj((nn+b−j)−(nn+a−j−1))
可以 O(2n+b) 求。