• 生成函数初探


    生成函数在计算方案数以及计算递推公式时都有很大的作用,本文对生成函数的知识做一个初步的介绍(主要是博主自己不会)

    一.基本定义:

    给出序列{$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}}$

    (以上内容不加证明直接给出)

    下面给出一道例题:

    luogu 2000

    题解看这里

    当然了,生成函数还有别的用处,比如用来求个通项之类的,最典型的例子就是斐波那契数列通项的计算,通常用的是特征根法,但是生成函数是一个适用范围更广的方法

    这里留坑

  • 相关阅读:
    [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)
    [poj3074]Sudoku(舞蹈链)
    [Bzoj1047][HAOI2007]理想的正方形(ST表)
    [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
    [Bzoj2431][HAOI2009]逆序对数列(前缀和优化dp)
    [Bzoj1072][SCOI2007]排列perm(状压dp)
    [Bzoj1195][HNOI2006]最短母串(AC自动机)
    Ajax解决IE浏览器兼容问题
    运行eclipse弹出“Failed to load the JNI shared”解决方法
    Java表单类双击提交
  • 原文地址:https://www.cnblogs.com/zhangleo/p/11005422.html
Copyright © 2020-2023  润新知