生成函数在计算方案数以及计算递推公式时都有很大的作用,本文对生成函数的知识做一个初步的介绍(主要是博主自己不会)
一.基本定义:
给出序列{$a_{n}$}={$a_{0},a_{1},a_{2}...a_{n}$},构造一个函数(或者多项式)$F(x)=a_{0}+a_{1}x+a_{2}x^{2}+...+a_{n}x^{n}$,则这个函数称作这个序列的生成函数(也叫母函数)
例:序列{$1,1,1....$}的生成函数是$F(x)=1+x+x^{2}+...$
可以看到,对于一个无穷数列,其生成函数自然会有无穷项
但是我们在解决问题时显然不可能讨论一个有无穷项的函数,而且这种函数的运算是极其困难的,因此我们考虑对这种函数进行化简:
(在化简这里有两种说法,这两种说法都能得出最后的结果,因此对于我这种蒟蒻暂且认为这二者等价,如果有大佬发现问题请及时讲解,谢谢!)
①.来自大部分资料的观点:
对于一个函数$F(x)=1+x+x^{2}+...$,可以发现这是一个等比数列求和的形式,由于在生成函数中真正体现数列性质的是每一项前的系数,而自变量本身的取值则意义不大,大部分时候我们不需要也不应该对这个自变量进行赋值,因此我们不妨给定一个定义域$xin (0,1)$,这样基于无穷递缩等比数列求和公式($sum_{i=0}^{∞}q^{i}=frac{1}{1-q}(qin (0,1)$)立刻可以得出该函数的一个变形:$F(x)=1+x+x^{2}+...=frac{1}{1-x}$
②.来自一个ppt的观点:
对于一个多项式,给出记法$F(x)$ $mod$ $x^{n}$表示$F(x)$在只保留次数低于$n$的项之后剩余的部分
那么仍然套用等比数列求和公式(虽然不是递缩的不一定收敛但保证$x!=1$公式还是可以用的嘛)
可以写出:$F(x)=frac{1-x^{n}}{1-x}$
当$n->∞$时,对任意的$m$,一定有:$frac{1-x^{n}}{1-x}$ $mod$ $x^{m}=frac{1}{1-x}$
因此$F(x)=1+x+x^{2}+...=frac{1}{1-x}$
(这两种观点我个人认为都是在$n->∞$时令$x^{n}=0$基于等比数列求和给出的,因此最后导出的结果一致,至于中间理解...见仁见智吧,我个人更喜欢第一种理解方式)
无论如何,我们已经做出第一个生成函数了
可是...这玩意有啥用?
问题:
设物品$A$共有$n$种价格,每种价格$i$有$a_{i}$个物品
设物品$B$共有$m$种价格,每种价格$i$有$b_{i}$个物品
求:已知总花费$w$,在$A$,$B$两种物品中各购买一件物品,问总方案数?
(sb水题)
设物品$A$选用的价格为$i$,则与之对应的物品个数即为$a_{i}$,那么物品$B$选用的价格即为$w-i$,与之对应的物品个数为$b_{i}$,因此这一种的贡献即为$a_{i}b_{w-i}$
因此总贡献即为$sum_{i=0}^{w}a_{i}b_{w-i}$
(我会FFT,NTT!!!)
于是目测这个问题已经解决了
(好像没用上生成函数嘛)
但是,如果我们换个角度思考,对序列{$a_{n}$},{$b_{m}$}分别构造生成函数$F(x)=sum_{i=0}^{w}a_{i}x^{i}$,$G(x)=sum_{i=0}^{w}b_{i}x^{i}$,那么上面的答案不就是$F(x)$与$G(x)$做卷积后$x^{n}$这一项前面的系数嘛!
(我不用生成函数也能看出来!)
如果我们有200个序列有各自的要求呢?
emmmmm.....
好像问题有点大...
但是,如果我们用生成函数,无论有多少个序列,最后也都是把这一坨东西乘起来就行了嘛
好像问题不大了...
可是...如果我们给出的数列有无穷项呢?
总不能跑无穷的FFT吧...
问题好像又出来了...
但是,如果仔细想想,怎么会让你做一个又没有递推(通项)又无穷的数列嘛!
这不是难为人吗
因此,如果一个数列有递推或者通项,那么生成函数可以借助上面的形式去化简啊
可是...我们最后要的是生成函数中某一项的系数,都变成这种诡异的分式怎么找最后的答案嘛!
不要忘了,上面我们做的都是等式,等式左右两侧可以互换的啊!
因此如果我们最后能求出一个分式的结果,那我们就能反向导出一个多项式!
因此我们的核心问题就在于怎么快速双向推导
我们有前辈的经验!
两个常见的模型:
$F(x)=1+x^{a}+x^{2a}+...=frac{1}{1-x^{a}}$
在有限项下的特殊情况:
$F(x)=1+x^{a}+x^{2a}+...+x^{na}=frac{1-x^{(n+1)a}}{1-x^{a}}$
(注意!无限项与有限项是有本质区别的,因此有限项不应该套成无限项的公式)
另一个模型:
$F(x)=sum_{i=0}^{∞}C_{i+k-1}^{k-1}x^{i}=frac{1}{(1-x)^{k}}$
(以上内容不加证明直接给出)
下面给出一道例题:
题解看这里
当然了,生成函数还有别的用处,比如用来求个通项之类的,最典型的例子就是斐波那契数列通项的计算,通常用的是特征根法,但是生成函数是一个适用范围更广的方法
这里留坑