zoukankan      html  css  js  c++  java
  • 生成函数学习笔记

    配套练习总地址 后面将只会写出题号(如:CF666D ),题解+代码都可以在这里找到。

    学习博文是 多项式计数杂谈 ,结合了一些别的东西和自己的理解。

    前置

    • 建议看看 《具体数学》或者至少手头上有书
    • 确保你会 1 2 3 中大部分的基础内容,不至于推出式子不会算。

    微积分常用公式

    求导线性性

    [egin{cases} (F(x)+G(x))'=F'(x)+G'(x)\\ (c*F(x))'=c*F'(x) end{cases} ]

    基本求导法则 :

    [(C')=0\\ (x^k)'=kx^{k-1}\\ (e^x)'=e^x,(ln(x))'=dfrac 1x\\ (a^x)'=a^xln a,(log_ax)'=dfrac 1{xln a}\\ (sin x)'=cos x,(cos x)'=-sin x\\ (F(x)G(x))'=F'(x)G(x)+F(x)G'(x)\\ left(dfrac{F(x)}{G(x)} ight)'=dfrac{F'(x)G(x)-F(x)G'(x)}{G^2(x)} ]

    链式法则(dfrac{d}{dx}dfrac{dx}{dz}=dfrac{d}{dz})

    复合函数求导 :(使用链式法则)

    [G(F(x))dfrac{d}{dx}=G(F(x))dfrac{d}{dF(x)}dfrac{dF(x)}{dx}=G'(F(x))F'(x) ]

    洛必达法则

    如果 (limlimits_{x o x_0}F(x)=0)(limlimits_{x o x_0}G(x)=0) ,且 (G'(x) eq 0) ,那么有

    [lim_{x o x_0}dfrac{F(x)}{G(x)}=lim_{x o x_0}dfrac{F'(x)}{G'(x)} ]

    常见不定极限的形式有 (dfrac{infin}{infin},infin-infin,0*infin) ,经过一些变化都能变成 (dfrac{0}{0}) 形式。

    泰勒展开及牛顿迭代 :见 多项式基础学习笔记(1) 相关部分。

    有限微积分

    可以参考 《具体数学》2.6 有限微积分和无限微积分 .

    无限微积分基于由

    [Df(x)=lim_{h o 0}dfrac{f(x+h)-f(x)}{h} ]

    定义的微分算子 (D) ,逆运算为 (int) .

    有基本规则(就是求导那个最简单的式子):(D(x^m)=mx^{m-1}) .

    有限微积分基于由

    [Delta f(x)=f(x+1)-f(x) ]

    定义的差分算子 (Delta) ,逆运算为 (sum) .

    对于 (Delta) ,下降幂有类似的优美规则:(Delta(x^{underline m})=mx^{underline{m-1}}) ,是基本的阶乘结果。

    对下降幂求和,类似 (int x^k=dfrac{x^{k+1}}{k+1}) ,有 (displaystylesumlimits_{i=0}^{n-1}i^{underline k}=dfrac{n^{underline{k+1}}}{k+1}) 。特别地,当 (k=-1) 时,有 (sumlimits_{i=0}^{n-1}i^{underline{-1}}=sumlimits_{i=1}^ndfrac 1i)

    定义移位算子 (Ef(x)=f(x+1)) ,有分部求和法则:(displaystyle sum uDelta v=uv-sum EvDelta u) .

    阶乘幂的性质

    阶乘幂就是上升幂和下降幂的统称。

    [x^{underline{a+b}}=x^{underline a}(x-a)^{underline b},x^{overline{a+b}}=x^{overline a}(x+a)^{overline b}\\ x^{underline n}=(-1)^n(-x)^{overline n},x^{overline n}=(-1)^n(-x)^{underline n} ]

    下降幂多项式:《具体数学》5.3 处理的技巧 - 技巧2:高阶差分 里面提到,能将通常幂表示成下降幂的和式。下降幂的求和是相当容易的(见上面的式子)。

    二项式反演

    这里简单给出二项式反演的两个形式。

    [f(n)=sumlimits_{i=n}^m{ichoose n}g(i)Leftrightarrow g(n)=sumlimits_{i=n}^m(-1)^{i-n}{ichoose n}f(i) ]

    (听说下面那种更常用……可能我做题比较少)

    [f(n)=sumlimits_{i=0}^n{nchoose i}g(i)Leftrightarrow g(n)=sumlimits_{i=0}^n(-1)^{n-i}{nchoose i}f(i) ]

    二项式反演+下降幂的两道练习题:

    P4921 :二项式反演+简单容斥

    CF755G :二项式反演+组合+化下降幂

    生成函数

    幂级数和封闭形式

    (F(x)=sumlimits_{i=0}^{infin}F[i]x^i) 被称为 幂级数 ,系数 (F[i]) 可以看做一个数列。那么幂级数也可以用如下方式得到:对于一个数列,将每个数附上 (x) 的幂,得到一个幂级数。例如,数列 (left<1,1,cdots ight>) 所得到的幂级数是 (F(x)=sumlimits_{i=0}^{infin}x^i) ,观察 (F(x))(xF(x)) ,有 (F(x)=xF(x)+1) ,于是有:(F(x)=dfrac{1}{1-x}) ,这就是它的生成函数。

    这里可能会产生一个问题:(F(x)) 收敛当且仅当 (|x|<1) ,但 幂级数收敛只是构造的条件 ,而非自然推导的产物。

    一种理解是 多项式基础学习笔记(1) 开头提到的界的概念, (displaystylesumlimits_{i=0}^{infin}x^imod x^n=sumlimits_{i=0}^{n-1}x^i=dfrac{1-x^n}{1-x}) 有界。

    另一种可以参看 rqy 的博文:浅谈 OI 中常用的一些生成函数运算的合法与正确性 .

    类似 (dfrac{1-x^n}{1-x}) 这样,相对和式或递归式更加简洁的式子,称为 “封闭形式” 。一些推导封闭形式的方法可以自行查阅《具体数学》,这里仅仅列举将和式转化为封闭形式的常见方式:

    • 归纳法
    • 扰动(就是将某一项(通常是头尾)剥离或加入进去,从而得到便于计算的式子),并利用交换求和次序等一些推式子常用技巧,或是将式子一般化(复杂化),然后再简化
    • 成套方法(对于递推式建立的一般方法)
    • 用积分替换和式,有限微积分
    • 生成函数

    (left<1,a,a^2,a^3,cdots ight> o F(x)=axF(x)+1) ,所以 (F(x)=dfrac{1}{1-ax}) 。类似这样的推导是很常见的手段之一:将递推式适当乘上 (x) 的幂次然后错位,用 (F(x)) 表示它自己,进而得到封闭形式。

    下面将给出一些数列的推导。

    Eg 1. 斐波那契数列

    (F[i]) 表示数列第 (i) 项,(F[0]=0,F[1]=1) .

    首先,写成生成函数的形式:(F(x)=sumlimits_{i=0}^{infin}F[i]x^i) 。然后,利用上面的错位技巧,结合斐波那契数列的递推式和前两项有关,不难想到用 (xF(x),x^2F(x)) 来推导:

    [egin{aligned} F(x)=sum_{i=1}F[i]x^i, xF(x)=sum_{i=1}F[i-1]x^i,x^2F(x)=sum_{i=2}F[i-2]x^i end{aligned} ]

    由于 (F[i]=F[i-1]+F[i-2]) ,所以相加得到:

    [xF(x)+x^2F(x)=F[0]+sum_{i=2}(F[i-2]+F[i-1])x^i=F[0]+sum_{i=2}F[i]x^i=F(x)-x ]

    于是就有

    [F(x)=dfrac{x}{1-x-x^2} ]

    这个封闭形式能求出斐波那契的通项公式 虽然没那么好看

    (x_1,x_2)(1-x-x^2) 的两实根,有

    [F(x)=dfrac{x}{(x-x_1)(x-x_2)}=xcdot dfrac{1}{x_2-x_1}cdot left(dfrac{1}{(x-x_1)}-dfrac{1}{(x-x_2)} ight) ]

    发现对 (dfrac{1}{x-x_1}) 的分母取相反数,可以得到一个类似 (dfrac{1}{1-x}) 的形式(别忘了,我们要求通项!所以必须要逆用封闭形式),那么考虑将它转化成这个形式

    [F(x)=dfrac{x}{x_2-x_1}cdotleft(dfrac{1}{x_2}cdotdfrac{1}{1-x/x_2}-dfrac{1}{x_1}cdotdfrac{1}{1-x/x_1} ight) ]

    直接逆用封闭形式就能得到

    [F(x)=dfrac{x}{x_2-x_1}cdot left(dfrac{1}{x_2}sum_idfrac{x^i}{x_2^i}-dfrac{1}{x_1}sum_idfrac{x^i}{x_1^i} ight) ]

    提出 ([x^n]) ,然后将 (x_1,x_2) 实值带入即可。

    Eg 2. 特征方程(解二阶递推式)

    一阶的成套方法可以在《具体数学》第二章中找到。

    求解 (F[n]=a*F[n-1]+b*F[n-2]) 的通项公式,其中 (F[0],F[1]) 已知。

    不妨设 (F) 是一个公比为 (q) 的等比数列,将所有 (F[]) 换成 (F[n-2]) 并用 (n o n-2)

    [q^2F(n)=aq*F(n)+bF(n)=>q^2-aq-b=0 ]

    设得到的两根为 (q_0,q_1) ,那么 (F[n]=x_0q_0^n+x_1q_1^n) 也必然满足递推公式,所以只需要用 (F[0],F[1]) 求出 (x_0,x_1) 即可。

    Eg 3. 常系数齐次线性递推(获取封闭形式)

    设对于数列 (F) 和递推系数 (C) ,当 (nge k) 时有 (C[0]=1)(displaystyle sumlimits_{i=0}^kC[i]F[n-i]=0) ,那么称 (F) 满足 (k) 阶线性常系数递推关系。令 (F(x))(F[n]) 的生成函数,构造

    [F_t(x)=C[t]x^tleft(F(x)-sum_{i=0}^{k-t-1}F[i]x^i ight) ]

    提出上式的 ([x^n]) 系数,得到的 ([nge k]C[t]F[n-t]) 就符合定义式,所以 (displaystylesum_{t=0}^kF_t(x)=0) ,即

    [sum_{t=0}^kC[t]x^tleft(F(x)-sum_{i=0}^{k-t-1}F[i]x^i ight)=0\\ =>left(sum_{t=0}^kC[t]x^t ight)F(x)=sum_{t=0}^{k-1}left(C[t]x^t-sum_{i=0}^{k-t-1}F[i]x^i ight) ]

    左式是 (C) 的生成函数,右边次数小于 (k) ,设为 (P(x)) ,得到 (C(x)F(x)=P(x)) ,即 (F(x)=dfrac{P(x)}{C(x)})

    这样就得到了 (F) 的生成函数。

    (hugecolor{red}具体操作咕咕咕,待填坑)

    Eg 4. 卡塔兰数

    (C[0]=1)(C[n]) 表示 (n) 对括号的合法序列个数。有 (C[n+1]=sum_{i=0}^nC[i]C[n-i])

    令其自卷,得到

    [C^2[k]=sum_{i=0}^kC[i]C[k-i]=C[k+1] ]

    (C[k+1]) 的幂级数是 (dfrac{C(x)-1}{x}) (相当于是整个 (C[k]) 序列平移到了 (C[k+1]) 序列),所以有

    [C(x)^2=dfrac{C(x)-1}{x}=>C(x)=dfrac{1pm sqrt{1-4x}}{2x} ]

    而生成函数有重要假设是其收敛,那么只需要验证 (lim_{x o 0}C(x)=C[0]=1) 即可,发现必须取负号。

    由广义二项式定理,有 (displaystylesqrt{1-4x}=sumlimits_{i=0}^{infin}inom{1/2}{i}(-4x)^i) ,所以可以得到系数

    [C[k+1]=dfrac{1+inom{1/2}{k}(-4x)^i}{2} ]

    另一种方式是用广义二项式级数得到:(参见《具体数学》5.4 生成函数

    [mathcal{B}_2(z)=sum_kinom{2k}{k}dfrac{z^k}{1+k}=sum_kinom{2k+1}{k}dfrac{z^k}{1+2k}=dfrac{1-sqrt{1-4z}}{2z} ]

    系数即为 (displaystyle inom{2n}{n}dfrac{1}{n+1}) .

    生成函数组合计数初步

    组合对象

    一般指满足某一性质的图、串等对象组成的集合 (A) ,每个元素 (ain A) 被定义了一个函数 (siz(a)) (如节点个数、串长),对于某个固定的 (n) ,记 (siz(a)=n)(a) 的个数为 (A[n]) .

    OGF

    基本概述

    普通生成函数 ordinary generating function

    数列 (F[n])OGF(F(x)=sumlimits_{i=0}F[i]x^i) 。例如:

    [{0,1,dfrac 12,dfrac 13,dfrac 14,cdots}xrightarrow{OGF}lndfrac{1}{1-x}=-ln(1-x)\\ {1,1,dfrac{1}{2!},dfrac{1}{3!},cdots}xrightarrow{OGF}e^x ]

    无标号对象的笛卡尔积

    集合 (A_1,A_2,cdots,A_n) 的笛卡尔积为 ({(a_1,cdots ,a_n)||a_1in A_1,a_2in A_2,cdots ,a_nin A_n}) ,记为 (A_1 imes cdots imes A_n) ,也就是从每个集合中各取一个元素形成的有序多元组集合。

    对于两个无标号组合对象 (A,B) ,令 (D=A imes B) ,且 (D) 中的每个元素 (d) 为二元组 ((a,b))(ain A,bin B)(siz(d)=siz(a)+siz(b)) ,于是有 (D(x)=A(x)*B(x)) .

    其实就是一个类似背包的思想,(A) 里面拿一个,(B) 里面拿一个,拼成 (D) 里的那个。

    Eg 骨牌问题

    有若干种颜色互不相同的骨牌,其中长度为 (i) 的骨牌有 (A[i]) 种,每种可以无限使用,求不重叠铺满 (n) 个长度的方案数。

    不难想到 (A(x)^k) 就是 (k) 个骨牌拼接的方案数(可以类比矩阵加速中,计算经过 (k) 条路之后的可达性的问题,更好理解),那么生成函数就是 (dfrac{1}{1-A(x)}) ,求逆即可。

    一个子问题就是斐波那契数,可以看做 ({1,2}) 的拼接序列。

    另一个子问题:P4451 ,骨牌+二次剩余+特征方程

    实战演练

    UVA12298 :背包+笛卡尔积

    CF438E :构造式子

    CF917D :树形DP+Prufer结论+组合意义

    EGF

    基本概述

    指数型生成函数 exponential generating function

    对于数列 (F[n]) ,其 EGF(F(x)=sumlimits_{i=0}F[i]dfrac{x^i}{i!}) 。两个 EGF 的乘法如下:

    [dfrac{(F*G)[k]}{k!}=sum_{i+j=k}dfrac{F[i]}{i!}dfrac{G[j]}{j!}\\ (F*G)[k]=sum_{i+j=k}dfrac{k!}{i!j!}F[i]G[j]=sum_{i+j=k}inom{k}{i}F[i]G[j] ]

    常见 EGF 的例子:

    [{1,1,cdots}xrightarrow{EGF}e^x,{1,-1,1cdots }xrightarrow{EGF}e^{-x}\\ {1,c,c^2,cdots }xrightarrow{EGF}e^{cx}\ {1,a,a^{underline 2},a^{underline 3},cdots }xrightarrow{EGF}(1+x)^a ]

    有标号对象的笛卡尔积

    两个有标号对象 (a,b) ,设其标号为 (1sim siz(a),1sim siz(b)) ,拼接得到 (c) 的方案数为 (displaystyleinom{siz(a)+siz(b)}{siz(a)}) ,也就是从 (siz(a)+siz(b)) 中选出 (siz(a)) 个给 (a) 中的元素,如果不能理解自行学习高中数学排列组合。

    Eg 染色问题

    rbg 三种颜色染色一个长度为 (n) 的纸条,使得颜色 r b 的个数是偶数,求方案数。

    我们可以分别求出单个染色的 EGF 然后再合并(也就是 EGF 卷积),而单个染色的 EGF 分别是 (e^x,dfrac{e^x+e^{-x}}{2}) ,前一个是 ({1cdots})EGF ,后一个用 ({1cdots}) 及其符号交替形式不难得到。相乘就得到:

    [dfrac{e^{3x}+2e^x+e^{-1}}{4},ans[n]=dfrac{3^n+2+(-1)^n}{4} ]

    实战演练

    HDU1521 (n) 种物品选出 (m) 的排列数,直接 EGF 卷积。

    P5219 结论:(n) 点最大度数为 (m) 的树的个数为 (G(n,m-1)-G(n,m-2))(G(n,m))(left(sumlimits_{i=0}^m dfrac{x^i}{i!} ight)^n) 的第 (n-2) 项。

    P5339

    exp 的组合意义

    (exp F(x)) 的展开式为 (sumlimits_{i=0}dfrac{F(x)^i}{i!}) ,如果将 (F(x)) 看成单个元素的 EGF ,那么 (exp F(x)) 就是这些元素组成的有标号集合。展开式的意义就是枚举元素个数并卷积拼接,由于元素无序所以要除以一个阶乘。这样就能解决一些集合计数问题。

    置换计数

    置换定义:有限集合到自身的双射。置换其实就是一系列环有标号生成的集合。

    给出一个集合 (S) ,求环大小在 (S) 内的 (1sim n) 元置换个数。

    一个大小为 (n) 的环的排列总数为 (n!) ,因为环能旋转,所以等价类总数为 ((n-1)!)

    单个环的 EGF(displaystylesumlimits_{i=1}[iin S]dfrac{(i-1)!x^i}{i!}) ,然后 (exp) 即可。

    如果所有大小都可选, (displaystylesum_{i=1}dfrac{(i-1)!x^i}{i!}=-ln(1-x))(exp(-ln(1-x))=dfrac{1}{1-x})

    实战演练

    P4841 结论:(n) 点简单有标号无向连通图的方案数为 (ln G(x))(G(n)=2^{inom n2}) .

    P5162

    重要结论

    对于一类组合对象 (A) ,由 (A) 种元素组成的序列定义的一类组合对象 (B) ,其生成函数为

    [B(x)=sum_{i=0}A(x)^i=dfrac{1}{1-A(x)} ]

    这个结论对 OGFEGF 均成立。

    PGF

    基本概述

    probabilistic generating function 基于概率的生成函数

    对于一个离散随机变量 (Xin N) ,其概率生成函数为 (F(z)=sumlimits_{i=0}P(X=i)z^i)(E(X)=sumlimits_{i=0}P(X=i)i=F'(1))

    可以进一步拓展到 (E(X^{underline k})=F^{(k)}(1)) (以下用 (F(x)^k) 表示幂次,用 (F^k(x)) 表示求导)

    方差计算式:( ext{Var}(X)=E((X-E(X))^2)=E(X^2)-E(X)^2) .

    下面用 PGF 来描述方差。

    注意到 (X^{underline 2}+X^{underline 1}=X^2) ,而 (E(X^{underline 2})=F''(1)) ,有

    [F''(1)+F'(1)=sumlimits_{i=0}i(i-1)P(X=i)+iP(X=i)=sumlimits_{i=0}i^2P(X=i)=E(X^2) ]

    所以方差就是 (F''(1)+F'(1)-F'(1)^2)

    实战演练

    P4548 :典型的掷硬币模型,即进行某个游戏直到终止态,问期望。

    P3706 :上一题的多终止态版本。

    HDU4652 :终止态全部等价的版本。不过用 DP 做更方便。

    天光渐亮。
  • 相关阅读:
    在vue项目中使用BetterScroll插件(2)-点击导航条定位
    在vue项目中使用BetterScroll插件(1)-滚动列表
    在vue项目中使用代理转发机制实现本地数据测试
    spring event的事件驱动模型的最佳实践@EventListene
    面向切面编程AOP的最佳入门示例
    使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型
    springboot下使用拦截器和过滤器
    微服务注册与发现eureka
    微服务相关概念
    Docker基础知识
  • 原文地址:https://www.cnblogs.com/UntitledCpp/p/GeneratingFunction_Study.html
Copyright © 2011-2022 走看看