看不懂的生成函数
Posted asuldb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看不懂的生成函数相关的知识,希望对你有一定的参考价值。
不得不说这个东西真是妙啊
遭到了降智打击
生成函数又叫做母函数,主要用于解决一些组合数学问题
对于一个数列({f_0,f_1,f_2,...,f_n})
我们定义其生成函数为
[F(x)=f_0+f_1x+f_2x^2+...+f_nx^n]
也就是
[F(x)=sum_{i=0}^nf_ix^i]
也就是把数列的每一项当成了多项式对应项的系数
$$$$
既然是函数,那么我们就可以去计算对应的函数值
比如一个数列
[{1,1,1,1,1,1...}]
它的生成函数
[F(x)=1+x+x^2+x^3+...]
发现这是一个无穷等比数列
于是
[F(x)=frac{1-x^n}{1-x}]
对于(xin (-1,1)),当(n)趋于无穷的时候,(x^n=0)
于是
[F(x)=frac{1}{1-x}]
对于一些特殊的数列,比如说
[{1,0,1,0,1,0,1,0,1...}]
也就是(mod 2=0)的项为(1),其余项为(0)
也就是
[F(x)=x+x^2+x^4+...]
简单换一下元,就会发现(F(x)=frac{1}{1-x^2})
于是我们可以发现生成函数
[F(x)=frac{1}{1-x^k}]
对应的数列是一个(k)的倍数项为(1),其余项为(0)的数列
$$$$
这样看也没什么用啊,怎么能跟组合计数有关系呢
我们都学过多项式,我们知道我们可以用多项式的系数来表示方案数
我们来考虑一个最简单多项式
[A=1+x+x^2+x^3+...]
(A)的第(i)项可以表示选取(i)个物品的方案数
写成生成函数(F(x)=frac{1}{1-x})
那么(A^k)就表示从(A)中进行(k)次选取的方案数,第(i)项就是选出(i)个物品的方案数
那么这个生成函数相乘表示什么呢
[F^k(x)=frac{1}{(1-x)^k}]
而
[A^k=sum_{i=0}inom{i-1+k}{k-1}x^i]
这就是一个组合数插板就得出来了
根据我不知道的广义二项式定理,上面的式子是相等的
于是我们得出一个重要结论
多项式的卷积对应的就是两个生成函数的乘积
$$$$
之后我们真的可以来做一道题了
先把所有的限制条件变成多项式和生成函数
必须是6的倍数,那么就是(F(x)=frac{1}{1-x^6})
最多用(9)块,也就是一个只有前(10)项系数为(1)的多项式,一个等比数列求和,(F(x)=frac{1-x^{10}}{1-x})
最多用5块,(F(x)=frac{1-x^{6}}{1-x})
必须是4的倍数,(F(x)=frac{1}{1-x^4})
剩下的就不写了,就是把每一个条件都抽象成生成函数,之后对这些个生成函数求一个乘积,发现是(F(x)=frac{1}{(1-x)^5})
我们把这个转化成多项式
[sum_{i=0}inom{i-1+5}{5-1}x^i]
我们要的是第(n)项系数,也就是(inom{n+4}{4})这就是答案了
$$$$
生成函数更神仙的地方就在于推通项了
比如说(fib)数列
[fib_n=egin{cases}1&nleq2\fib_{n-1}+fib_{n-2}&n>2end{cases}]
其生成函数为
[egin{aligned} F(x)=&sum_{i=1}fib_ix^i\&=sum_{i=1}(fib_{i-1}+fib_{i-2}+[i=1])x^i\&=sum_{i=1}fib_{i-1}x^i+sum_{i=1}fib_{i-2}x^i+x\&=xsum_{i=1}fib_{i-1}x^{i-1}+x^2sum_{i=1}fib_{i-2}x^{i-2}+x\end{aligned}]
发现这个(sum_{i=1}fib_{i-1}x^{i-1})和(sum_{i=1}fib_{i-2}x^{i-2})不都是(F(x))吗
于是就有
[F(x)=xF(x)+x^2F(x)+x]
于是我们可以求得
[F(x)=frac{x}{1-x-x^2}]
这就是(fib)数列的生成函数了
但是这有什么用呢
可以求通项啊
我们把分母上的(1-x-x^2)因式分解一下
[F(x)=frac{x}{(1-frac{1-sqrt5}{2}x)(1-frac{1+sqrt5}{2}x)}]
在搞一搞
[F(x)=-frac{1}{sqrt5}frac{1}{(1-frac{1-sqrt5}{2}x)} + frac{1}{sqrt5}frac{1}{(1-frac{1+sqrt5}{2}x)}]
发现出现了诸如(frac{1}{1-cx})这样的生成函数
我们知道这样的生成函数对应的多项式应该形如(sum_{i=1}c^ix^i)
所以就会有
[fib_n=-frac{1}{sqrt5}(frac{1-sqrt5}{2})^n+frac{1}{sqrt5}(frac{1+sqrt5}{2})^n]
真是优雅自然
我们再来推一个难一点的数列,卡特兰数
卡特兰有一个递推式是这个样子的
[f_n=egin{cases}1&n=0\sum_{i=0}^{n-1}f_if_{n-i-1}&n>0end{cases}]
我们照样来推一下
[egin{aligned} F(x)&=sum_{i=0}(sum_{j=0}^{i-1}f_jf_{i-j-1}+[i=0])x^i\&=1+sum_{i=1}(sum_{j=0}^{i-1}f_jf_{i-j-1})x^i\&=1+xsum_{i=1}(sum_{j=0}^{i-1}f_jf_{i-j-1})x^{i-1}end{aligned}]
考虑把(x^{i-1})分成(x^{j} imes x^{i-j-1}),之后分进去
就是
[egin{aligned} F(x)&=1+xsum_{i=1}sum_{j=0}^{i-1}f_jx^j imes f_{i-j-1}x^{i-j-1}end{aligned}]
惊奇的发现(f_jx^j)是对应多项式的(j)次项,(f_{i-j-1}x^{i-j-1})是对应多项式的(i-j-1)次项,于是内部还是一个卷积的形式也就是卡特兰数自己卷自己,就是(F^2(x))
于是
[F(x)=1+xF^2(x)]
这不是一元二次方程吗,解一下这个方程
发现
[F(x)=frac{1pm sqrt{1-4x}}{2x}]
发现竟然有一个正负号的问题
分式方程不好解我们上整式方程
设(k=frac{1pm sqrt{1-4x}}{2x})
[2xkpm sqrt{1-4x}=1]
尽管生成函数的(x)没有什么意义,但是我们带入(x=0)的时候,(F(0)=f_0),这是非常显然的
于是
[2 imes 0 imes 0pm1=0]
显然那个符号应该是正,由于这是移项过来的,于是在那边应该是个负号,所以
[F(x)=frac{1-sqrt{1-4x}}{2x}]
这个东西有什么用呢,可以搞卡特兰数的通项!
我们发现那个(sqrt{1-4x})就是((1-4x)^{frac{1}{2}}),尝试二项式定理
[(1-4x)^{frac{1}{2}}=sum_{i=0}inom{frac{1}{2}}{i}(-4x)^i]
推不动了,先弃疗了
$$$$
来一道神仙题
感性理解一下这个(n)个节点的二叉树同构的数量就是(f_n),卡特兰数
现在的问题就是求一个分子,就是所有(n)个节点的二叉树的同构的叶子节点的个数
我们设为(h_n)
答案就是(frac{h_n}{f_n})
我们考虑一下(h_n)如何求
显然我们可以利用一个类似卡特兰的转移
[h_i=sum_{i=0}^{j-1}h_jf_{i-j-1}+h_{i-j-1}f_j]
就是枚举左右儿子的节点个数,之后由于要和另一个儿子组合,于是得乘上方案数
于是现在可以去写一个(O(n^2))的了
f[0]=1,f[1]=1;
for(re int i=2;i<=n;i++)
for(re int j=0;j<i;j++) f[i]+=f[j]*f[i-j-1];
h[0]=0,h[1]=1;
for(re int i=2;i<=n;i++)
for(re int j=0;j<i;j++) h[i]+=f[i-j-1]*h[j]+f[j]*h[i-j-1];
printf("%.12lf",double(h[n])/double(f[n]));
考虑到这个形式我们并不是很好化简,于是考虑到(f_jh_{i-j-1})会被算到两次
于是直接写成
[h_i=2sum_{i=0}^{j-1}h_jf_{i-j-1}]
我们得特殊定义一下(h_1=1)
考虑求这个函数的生成函数
[egin{aligned}F(x)=&sum_{i=1}(2sum_{j=0}^{i-1}h_jf_{i-j-1}+[i=1])x^i\&=x+sum_{i=1}(2sum_{j=0}^{i-1}h_jf_{i-j-1})x^i\&=x+xsum_{i=1}(2sum_{j=0}^{i-1}h_jf_{i-j-1})x^{i-1}\&=x+xsum_{i=1}2sum_{j=0}^{i-1}h_jx_j imes f_{i-j-1}x^{i-j-1}end{aligned}]
设(G(x)=sum_{i=0}f_ix^i)
于是
[egin{aligned}F(x)=&x+2xF(x)G(x)end{aligned}]
我们知道(G(x)=frac{1-sqrt{1-4x}}{2x})
于是我们可以解得
[F(x)=frac{x}{sqrt{1-4x}}]
之后我就又不会做了,愉快地去看题解,发现果真还是菜啊
并不会求导,于是只能复述一下题解
对(xG(x))求导,发现
[(xG(x))'=frac{1}{sqrt{1-4x}}=frac{F(x)}{x}]
据说(xG(x))求导之后每一项从(f_ix^{i+1})变成了((i+1)f_ix^i)
就等于对应的(frac{F(x)}{x})的每一项(h_ix^{i-1}),也就是(h_{i+1}x^i)
也就是说我们得到了
[h_{i+1}x^{i}=(i+1)f_ix^i]
就是
[h_{i+1}=(i+1)f_i]
所以(h_i=if_{i-1})
之后我们的答案就是
[frac{nf_{n-1}}{f_n}]
我们利用卡特兰数的通项公式(f_n=frac{1}{n+1}inom{2n}{n})
于是
[egin{aligned}frac{nf_{n-1}}{f_n}&=frac{nfrac{1}{n}inom{2n-2}{n-1}}{frac{1}{n+1}inom{2n}{n}}\&=frac{(n+1)frac{(2n-2)!}{(n-1)!(n-1)!}}{frac{(2n)!}{n!n!}}\&=frac{(2n-2)!n!n!(n+1)}{(2n)!(n-1)!(n-1)!}\&=frac{n^2(n+1)}{2n(2n-1)}=frac{n(n+1)}{2(2n-1)}end{aligned}]
以上是关于看不懂的生成函数的主要内容,如果未能解决你的问题,请参考以下文章