[笔记]生成函数及其展开技巧

定义

定义形如 f(x)=i=0aixi 的式子为生成函数,其中 x 是一个不定元,取值需要保证 f(x) 收敛。需要注意的是,x 在生成函数中并不以未知数的形式单独出现,其意义也脱离了代数上的未知数本身。

生成函数大致分为两种:OGFEGF。前者主要用于无标号问题的计数,后者主要应用于有标号问题的计数。

为了书写方便,在下文中,将 a0+a1x+a2x2 简写成 {a0,a1,a2}

约定

  • 为了书写方便,在下文中,将 a0+a1x+a2x2 简写成 {a0,a1,a2}

  • f(x)xi 的系数记为 [xi]f(x),简记为 f(x)[i]

数学基础

  • D 算子(求导算子)

Df(x)=limδ0f(x+δ)f(x)δ

对于 f(x)[i],对其施加以求导算子之后,(Df(x))[i]=(i+1)f(x)[i+1]

  • 上升幂和下降幂

定义 xm_xm 次下降幂,xm_=x(x1)(x2)(xm+1)

定义 xm¯xm 次上升幂,xm¯=x(x+1)(x+2)(x+m1)

下面是关于上升 / 下降幂的有用的性质:

  • xm+n_=xm_(xm)n_

  • xm+n¯=xm¯(x+m)n¯

  • xm_=(1)m(x)m¯

  • xm¯=(1)m(x)m_

  • Δ 算子(差分算子)

类似求导算子,我们定义差分算子 ΔΔf(x)=f(x+1)f(x)

它不具有求导算子那样优美的性质,但是其对于下降幂来说,与求导的运算法则相同。具体的,Δ(xm_)=mxm1_

可以发现,差分算子和求导算子十分相似,他们也有一些比较相似的性质,例如:D(ex)=ex,Δ(2x)=2x

后面的两个公式常用于上升幂和下降幂的转化。

生成函数的封闭形式

对于 OGF,其常常有自己的封闭形式。下面举几个例子。

  • Example 4.1: {1,1,1,1} 的生成函数。

这是 OIer 最喜闻乐见的式子。不妨设 f(x)=0xi,则有 xf(x)=1xi。可以发现,这相当于对 f 施加了 平移算子 E。将两个错项相减可以得到:

f(x)xf(x)=1

f(x)=11x

我们称 11xf(x) 的封闭形式。上面计算生成函数封闭形式的做法称为错位相减,是小学数学常用的一种方法。

利用上面的算法,可以求出下面几个生成函数的封闭形式:

  • {1,1,1,1}OGF11x

  • {1,a,a2,a3}OGF11ax

  • {1,xk,x2k,x3k}OGF11xk

  • {1,c1xk,c2x2k}OGF11cxk

  • {0,1,12,13}OGFln(1x)

  • {1,1,12!,13!}OGFex

  • {1,1,1}OGF11x

封闭形式的展开技巧

  • 泰勒展开 / 麦克劳林展开

f(x)=f(x)(i)i!

上面的式子称为麦克劳林展开。注意,上面的式子没有考虑到 f 的敛散性。

通过麦克劳林展开,我们可以得到几乎所有函数的展开式。

  • 换元法

利用上面得到的重要结论

f(x)=11x=xi

将其中的 x 换成 qx,可以得到:

f(x)=11qx=qixi

可以使用还原得到一些其他结论。

Example 5.1f(x)=314x 的展开形式。

f(x)=3114x=34ixi

Example 5.2f(x)=11+x 的展开式。

f(x)=11(x)=(1)ixi

Example 5.3f(x)=534x 的展开式。

f(x)=5/314/3x=531143x=53(43)ixi

可以发现,这个方法非常好用。它可以展开几乎一切分母为一次的分式。

  • 裂项法

上面的换元法非常好用,但是只适用于 1 次的式子。对于高次的式子,我们尝试将他变成 1 次的进行解决。

Example 5.4f(x)=1x24x+3 的展开式。

考虑到分母可以表示成 (1x)(3x) 的形式,我们尝试裂项。

不妨设 f(x)=1(1x)(3x)=A1x+B3x 的形式。

可以发现,A1x+B3x=A(3x)+B(1x)(1x)(3x)

于是有 A(3x)+B(1x)=1。解这个方程,得到:

A=1/2,B=1/2

对于分母更高次的情况,只要有实根,就可以裂项降次。

  • 递推法

这个方法用于补裂项法的坑。

有的时候,分母是高次方程且没有实根,这非常不好,因为没法裂项。这时候可以使用这个方法。

Example 5.5f(x)=112x+7x2 的展开形式。

我们发现对于分母,Δ=428<0,因此没有实根,无法裂项。

考虑设 f(x)=112x+7x2=a0+a1x+a2x2

则有

(12x+7x2)(a0+a1x+a2x2)=1

做一下这个卷积,可以得到

a0=1a12a0=0a22a1+7a0=0

因此,a0=1,a1=2,对于 n>1an=2an17an2。这样我们得到一个递推形式。

利用特征根方程即可求出该递推式的通项。


学了上面这么多展开技巧,我们来举几个实际例子。

Example 5.6 斐波那契数列通项

定义 f0=0,f1=1n2,fn=fn1+fn2。求 f 的通项。

不妨设 F(x)=fixi={0,1,1,2,3,5,8}

我们对 F 施加一个平移算子,也就是乘上 x,得到

xF(x)=fixi+1={0,0,1,1,2,3,5,8,}

再施加一次平移算子,得到

x2F(x)=fixi+2={0,0,0,1,1,2,3,5,}

可以发现,(F(x)xF(x)x2F(x))[n]=0(As for x2)。对于 x<2,我们强行补上即可。所以得到:

F(x)xF(x)x2F(x)=1

F(x)=11xx2

这样我们得到了 F(x) 的封闭形式。

接下来我们要对这个封闭形式进行展开。发现分母有实根,这非常好。我们求出它的两个实根,分别为

x1=152,x2=1+52

采用展开技巧中的裂项法对他进行裂项,得到

F(x)=Ax1x+Bx2x

可以解得 A=55,B=55

A,B 代入并进行一顿化简(化简过程使用换元法)后,可以得到斐波那契数列的通项公式:

fn=55[(1+52)n(152)n]


普通型生成函数的应用

Example 6.1 ACW 3132

一共八种物品,你要买这些物品。每个物品可以买无限件。

不妨将这八种物品设为 A,B,C,D,E,F,G,H,每种物品的购买有限制:

  • A:只能购买偶数个。

  • B:只能购买 0 个或 1 个。

  • C:只能购买 0 个,1 个或 2 个。

  • D:只能购买奇数个。

  • E:只能购买 4 的倍数个。

  • F:只能购买 0,1,23 个。

  • G:只能购买 1 个。

  • H:只能购买 3 的倍数个。

求购买 n 个物品的方案数。n10500,答案对 10007 取模。

做法一:背包。设 fi 表示选择了 i 个物品的方案数。转移即可。

做法二:流氓算法。使用背包打表,用 BM 弄出通项。

做法三:使用生成函数。

我们考虑每种物品的生成函数对应的是什么。对于 A 物品,不妨将其生成函数设为 A(x),后面同理。

  • A(x)=1+x2+x4+=11x2

  • B(x)=1+x=1x21x

  • C(x)=1+x+x2=1x31x

  • D(x)=x+x3+x5+=x1x2

  • E(x)=1+x4+x8+=11x4

  • F(x)=1+x+x2+x3=1x41x

  • G(x)=1+x=1x21x

  • H(x)=1+x3+x6+=11x3

把这些东西乘起来消消乐,剩下的答案就是:

x(1x)4

这样我们得到了封闭形式。展开就可以得到答案。我们尝试对这个东西进行展开。利用广义二项式定理,我们可以得到:

1(1x)4=i=0(4)i_i!(x)i=i=0(4)i_(1)ii!xi=i=04i¯i!xi=i=0(3+i)i_i!xi=i=0(3+ii)xi

乘上 x 相当于对其施以平移算子,答案即为

(n+2)(n+1)n6

Bonus:最后对于 1(1x)4 的化简,其实有更简单的方法。

对于 11x 求三阶导,发现就等于 1(1x)4

Example 6.2 P2000 拯救世界

和上一题差不多,列出来十个生成函数,乘起来消消乐就可以了。

Example 6.3 Super Poker II

写出四种扑克的 OGF,乘起来就可以了。由于没有绑账号所以没有写。

Some Important Tricks

  • F(x) 乘以 A(x)=1+x+x2+x3,可以求出 F(x) 的前缀和。例子:差分与前缀和

指数型生成函数

指数型生成函数(EGF),通常用于有标号方案计数,如图计数等。

对于数列 P,其 EGF 定义为:

i=0Pii!xi

下面是一些常见数列的 EGF

  • {1,1,1,1}EGFex

  • {1,1,1,1}EGFex

  • {1,c,c2,c3}EGFecx

  • {1,0,1,0}EGFex+ex2

  • {1,a,a2,a3,a4}EGF(1+x)a

上述推导可以直接在 0 处泰勒展开。

指数型生成函数应用

  • 图计数

Example 8.1

n 个点的无向连通图计数。

B=2(i2)xi,表示无向图的方案数。

A=fixi,表示无向连通图方案数。

则有 B=eA,将 Bln 可以得到 A

posted @   Link-Cut-Y  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示