zoukankan      html  css  js  c++  java
  • 生成函数小结

    前置芝士

    广义二项式定理

    (alpha)是实数,对于所有满足(0leq |x| <|y|)(x)(y),有

    [(x+y)^alpha=sum_{k=0}^{infty}dbinom{alpha}{k}x^ky^{alpha-k} ]

    其中

    [dbinom{alpha}{k}=frac{alpha(alpha-1)cdots (alpha-k+1)}{k!} ]

    泰勒展开

    (假设下式中的所有导数均是有意义的)

    对于某个函数(f(x)),我们可以取一个使其有(n)阶导的(x_0),并利用((x-x_0))(n)次多项式来逼近(f(x)).此时下式成立:

    [f(x)=frac{f(x_0)}{0!}+frac{f'(x_0)}{1!}(x-x_0)+frac{f^{(2)}(x_0)}{2!}(x-x_0)^2+cdots+frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R_n(x) ]

    其中(f^{(n)}(x))(f(x))(n)阶导数,(R_n(x))表示余项(事实上由于生成函数都是形式幂级数,我们不需要考虑其在何处收敛,更重要的是一般题目只会要求保留前(n)项,所以OI里根本不关心(R_n(x))长啥样.)

    (x_0=0)时,(f(x))的泰勒展开即为麦克劳林级数,即

    [f(x)=frac{f(0)}{0!}+frac{f'(0)}{1!}x+frac{f^{(2)}(n)}{2!}x^2+cdots+frac{f^{(n)}(0)}{n!}x^n+R_n(x) ]

    一般生成函数(Ordinary Generating Function)

    定义

    对于给定的数列(A),定义其一般生成函数(Ordinary Generating Function,简称OGF)(A(x))

    [A(x)=sum_{igeq 0}A_ix^i ]

    例子:
    数列(<1,1,1,cdots>)的生成函数为(1+x+x^2+cdots).

    数列(<0,1,2,cdots>)的生成函数为(0+x+2x^2+cdots).

    运算

    对两个生成函数(F(x),G(x)).

    • 加(减)法

    [F(x)pm G(x)=sum_{igeq 0}(f_ipm g_i)x^i ]

    • 数乘

    [cF(x)=sum_{igeq 0}(cf_i)x^i ]

    • 乘法

    [F(x) imes G(x)=sum_{igeq 0}(sum_{j=0}^if_jg_{i-j})x^i ]

    • 右移

    [x^mF(x)=sum_{igeq m}f_{i-m}x^i ]

    • 左移

    [frac{F(x)-sum_{i=0}^{m-1}f_ix^i}{x^m}=sum_{igeq 0}f_{i+m}x^i ]

    • 求导

    [F'(x)=sum_{igeq 0}(i+1)f_{i+1}x^i ]

    • 积分

    [int F(x){ m d}x=sum_{i>0}frac{f_{i-1}}{i}x^i+C(C为常数) ]

    常见序列的OGF

    根据上述运算法则,我们可以找到一些有着特殊性质的数列的OGF.

    一个常数序列

    考虑数列(<1,1,1,1,1>)的OGF,它是(1+x+x^2+x^3+x^4).

    发现它有点像等比数列求和的形式,那么能不能把它按照等比数列求和公式写成(frac{1-x^5}{1-x})呢?

    虽然看起来这时(x=1)时这个函数是无意义的,但是由于生成函数本质上是形式幂级数,所以我们并不关心它在何处收敛。我们只考虑这个函数的麦克劳林级数即可。

    将上面的结论推广可以得到数列(<1,1,1,cdots>)的OGF为(frac{1}{1-x}).

    更多的OGF

    继续推广上面的结论,可以得到数列(<1,a,a^2,cdots>)的OGF为(frac{1}{1-ax}).

    考虑一下((frac{1}{1-x})^2)是什么,它可以看成是两个(1+x+x^2+cdots)的乘积,那么新函数的第(i)项的系数等价于将(i)拆成两个非负整数的和的方案数,也就是说新函数是数列(<1,2,3,cdots>)的生成函数。

    继续推广下去,(frac{1}{(1-x)^m})可以看成(m)(1+x+x^2+cdots)的乘积,故(x^i)的系数为将(i)拆分为(m)个非负整数之和,也就是(dbinom{i+m-1}{i}).再把(x)代换为(ax),就有了这个式子:

    [(frac{1}{1-ax})^m=sum_{igeq 0}dbinom{i+m-1}{i}x^i ]

    然后拿一些东西带进去就会有一些好玩的东西:

    [sum_{igeq 0}(i+1)x^i=frac{1}{(1-x)^2}\ sum_{igeq 0}(-1)^ix^i=frac{1}{1+x}\ ]

    最后还有一个(<1,frac{1}{2},frac{1}{3},cdots>),它的生成函数是(-ln(1-x)),证明的话考虑将后面那个Taylor展开即可。

    例题

    求数列(<0,1,4,cdots,n^2,cdots>)的生成函数

    令所求的生成函数为(F(x)), 则有

    [egin{aligned} F(x)=&sum_{igeq 0}i^2x^i\ xF(x)=&sum_{igeq 1}(i-1)^2x^i\ (1-x)F(x)=&sum_{igeq 1}(2i-1)x^i\ =&2sum_{igeq 1}ix^i-sum_{igeq 1} x^i\ =&frac{x}{(1-x)^2}-frac{x}{1-x}\ =&frac{x(x+1)}{(1-x)^2} end{aligned} ]

    最后可以得到

    [F(x)=frac{x(x+1)}{(1-x)^3} ]

    利用OGF求数列的通项

    Fibonacci数列

    已知Fibonacci数列的递推式为:

    [f_n= egin{cases} 0 & n=0\ 1 & n=1\ f_{n-1}+f_{n-2} & n>1 end{cases} ]

    求数列(f_n)的生成函数(F(x)).

    [egin{aligned} F(x)=&sum_{igeq 0}f_ix^i\ =&x+sum_{i>1}(f_{i-1}+f_{i-2})x^i\ =&x+sum_{igeq 0}f_i x^{i+1}+sum_{igeq 0}f_ix^{i+2}\ =&x+xF(x)+x^2F(x) end{aligned} ]

    解得(F(x)=frac{1}{1-x-x^2}).

    看起来我们的确完成了任务,但是这个封闭形式除了长的短以外毫无作用。

    注意到那些形如(frac{1}{1-ax})的生成函数我们是能够很好的展开的,于是考虑将这个封闭形式写成若干个乘积。

    (phi=frac{1+sqrt 5}{2},hat{phi}=frac{1-sqrt5}{2}),则分母有(1-x-x^2=(1-phi x)(1-hat{phi} x)),之后我们假设(F(x)=frac{A}{1-phi x}+frac{B}{1-hat{phi}x}),最终解得(F(x)=frac{1}{sqrt 5}(frac{1}{1-phi x}-frac{1}{1-hat{phi} x})=frac{1}{sqrt 5}sum_{igeq 0}(phi^i-hat{phi}^i)x^i).

    求解某些组合计数问题

    生成函数在求解选取某些物品的方案数时有一些神奇的效果。

    例题:有(A.B,C,D)四种物品,假设每种都有无限个,现在要求恰好拿出(n)个,其中(A)必须拿偶数个,(B)必须拿(5)的倍数个,(C)至多能拿(4)个,(D)至多能拿(1)个,求方案数。

    解:分别记拿(A,B,C,D)四种物品拿(n)个的方案数的生成函数为(A(x),B(x),C(x),D(x)).那么显然有:

    [A(x)=1+x^2+x^4+cdots=frac{1}{1-x^2}\ B(x)=1+x^5+x^{10}+cdots=frac{1}{1-x^5}\ C(x)=1+x+x^2+x^3+x^4=frac{1-x^5}{1-x}\ D(x)=1+x ]

    记最终答案的生成函数为(F(x)),根据组合意义发现有(F(x)=A(x)B(x)C(x)D(x)=frac{1}{(1-x)^2}=1+2x+3x^2+cdots).也就是([x^n]F(x)=n+1),故最终的答案就是(n+1).

    指数生成函数(Exponential Generating Function)

    引入及定义

    考虑一下上面那个数数题,我们认为(F(x))是简单的四个生成函数相乘的结果,是因为在这里我们认为顺序影响结果,我们只关心每一类物品选了多少个。举个例子,假设某个(n=3)的方案依次选了2个(A)物品和1个(B)物品,那么无论(B)在两个(A)之前还是之后都是同一种方案。那么假设题目开始考虑这一种情况了呢?

    考虑一种只有(2)个物品且无限制的情况:假设我们当前选了(n)(A)物品和(m)(B)物品,那么最终是有(n+m)个物品的,考虑把这看成一个长(n+m)的序列,则有(n)个位置上是物品(A),所以在两种物品的方案数相乘的同时还有一个组合数的贡献。具体的,我们记选A物品和选B物品的方案数分别是(f_i,g_i),最终答案的(h_i),则有

    [egin{aligned} h_i=&sum_{j=0}^idbinom{i}{j}f_jg_{i-j}\ h_i=&frac{i!}{j!(i-j)!}f_jg_{i-j}i \ frac{h_i}{i!}=&frac{f_j}{j!}frac{h_{i-j}}{(i-j)!} end{aligned} ]

    我们发现,如果能把(i!)也看成是(x^i)的一部分的话,那么它们的生成函数的乘法依然和最开始的OGF是一致的,这就引出了指数生成函数(Exponential Generating Function,简称EGF).

    对于给定的数列(A),定义其指数型生成函数(A(x))为:

    [ A(x)=sum_{igeq 0}frac{A_i}{i!}x^i ]

    运算

    (F(x),G(x))分别是数列(f_i,g_i)的EGF.

    • 加(减)法

    [ F(x)pm G(x)=sum_{igeq 0}(f_i+g_i)frac{x^i}{i!} ]

    • 数乘

    [ cF(x)=sum_{igeq 0}cf_ifrac{x^i}{i!} ]

    • 乘法

    [ F(x)G(x)=sum_{igeq 0}(sum_{j=0}^idbinom{i}{j}f_jg_{i-j})x^i ]

    • 左移(?)

    [x^mF(x)=sum_{igeq m} f_{i-m}frac{x^i}{(i-m)!}=sum_{igeq m}f_{i-m} frac{x^i}{i^{underline{m}}} ]

    其中有(n^{underline{m}}=n(n-1)cdots(n-m+1)).

    • 右移(?)

    [frac{F(x)-sum_{i=0}^{m-1}f_ix^i}{x^m}=sum_{igeq 0}f_{i+m}frac{x^i}{(i+m)!}=sum_{igeq 0}f_{i+m}frac{1}{(i+m)^{underline{m}}}frac{x^i}{i!} ]

    • 求导

    [F'(x)=sum_{igeq 0}frac{f_{i+1}}{(i+1)!}(i+1)x^i=sum_{igeq 0}f_{i+1}frac{i!}{i!} ]

    • 积分

    [int F(x){ m d}x=sum_{i>0}frac{f_i}{i!(i+1)}x^{i+1}+C=sum_{i<0} f_ifrac{x^{i+1}}{i+1}+C(C为常数) ]

    注意到,由于在OI中我们存储EGF时一般存的都是(frac{f_n}{n!}),所以要想实现(f_n)的左移和右移需要借助求导和积分。

    常见数列的EGF

    注意数列(f_n)的EGF和数列(frac{f_n}{n!})的OGF是等价的。

    [ <1,1,1,1,cdots> o e^x \ <1,0,1,0,cdots> o frac{e^x+e^{-x}}{2} \ <0,1,0,1,cdots> o frac{e^x-e^{-x}}{2} \ ]

    利用EGF解决某些简单的组合问题

    不要忘记EGF是考虑不同种物品之间的顺序的,相对应的,OGF并不考虑。

    例:用红、白、蓝三种颜色给(1 imes n)的格子染色,要求红色格子的数目是偶数,且至少有一个格子是蓝色的方案数(f_n).

    解:记(f_n)的EGF为(F(x)).仿照OGF的例题,我们将三种颜色的方案数的生成函数乘起来。

    [egin{aligned} F(x)=&(1+frac{x^2}{2!}+frac{x^4}{4!}+cdots)(1+frac{x}{1!}+frac{x^2}{2!}+cdots)(frac{x}{1!}+frac{x^2}{2!}+frac{x^3}{3!}+cdots)\ =&(frac{e^x+e^{-x}}{2})e^x(e^x-1)\ =&frac{e^{3x}-e^{2x}+e^x-1}{2}\ =&-frac{1}{2}+sum_{igeq 0}frac{3^n-2^n+1}{2}frac{x^n}{n!} end{aligned} ]

    故最终有

    [f_n= egin{cases} 0 & n=0\ frac{3^n-2^n+1}{2} & n>0\ end{cases} ]

    集合的EGF

    考虑这样的问题:我们需要数集合(S)中元素的数量,但是集合(S)是由集合(A)中的元素拼接而成的。假设我们已知集合(A)中元素的生成函数,那么集合(S)的生成函数为(下式的(A,S)均表示函数)

    [S=e^A ]

    例:求(n)个点的无向有标号连通图的数量(f_n), 要求无重边无自环。

    解:记(n)个点的无向图的数量为(g_n). 由于(n)个点的无向图中最多有(dbinom{n}{2})条边,每条边的存在与否都会影响到方案,故有:

    [ g_n=2^{dbinom{n}{2}} ]

    分别记(f_n,g_n)的生成函数为(F(x),G(x)),由于无向图可以看成是若干个无向连通图拼在一起形成的,故:

    [ G(x)=e^{F(x)} ]

    两边同时取(ln)

    [F(x)=ln G(x) ]

    至于多项式如何取(ln), 并不是本文的重点。可以自行上网百度

    参考资料

  • 相关阅读:
    c语言中 fgetc函数、fputc函数实现文件的复制
    c语言 13-7 利用fgetc函数输出文件的字符数
    c语言 13-6 利用fgetc函数输出文件的行数
    c语言中fgetc函数:显示文件内容
    c语言 13-5
    c语言 获取程序上一次运行时间的程序
    hzwer模拟赛 虫洞
    LYDSY热身赛 escape
    bzoj2330 糖果
    繁华模拟赛 Vicent坐电梯
  • 原文地址:https://www.cnblogs.com/encodetalker/p/12657259.html
Copyright © 2011-2022 走看看