定义形如 f(x)=∞∑i=0aixi 的式子为生成函数,其中 x 是一个不定元,取值需要保证 f(x) 收敛。需要注意的是,x 在生成函数中并不以未知数的形式单独出现,其意义也脱离了代数上的未知数本身。
生成函数大致分为两种:OGF 和 EGF。前者主要用于无标号问题的计数,后者主要应用于有标号问题的计数。
为了书写方便,在下文中,将 a0+a1x+a2x2⋯ 简写成 {a0,a1,a2⋯}。
-
为了书写方便,在下文中,将 a0+a1x+a2x2⋯ 简写成 {a0,a1,a2⋯}。
-
将 f(x) 中 xi 的系数记为 [xi]f(x),简记为 f(x)[i]。
Df(x)=limδ→0f(x+δ)−f(x)δ。
对于 f(x)[i],对其施加以求导算子之后,(Df(x))[i]=(i+1)f(x)[i+1]。
定义 xm–– 为 x 的 m 次下降幂,xm––=x(x−1)(x−2)⋯(x−m+1)。
定义 x¯¯¯¯¯m 为 x 的 m 次上升幂,x¯¯¯¯¯m=x(x+1)(x+2)⋯(x+m−1)。
下面是关于上升 / 下降幂的有用的性质:
-
xm+n––––––=xm––(x−m)n––
-
x¯¯¯¯¯¯¯¯¯¯¯¯m+n=x¯¯¯¯¯m(x+m)¯¯¯n
-
xm––=(−1)m(−x)¯¯¯¯¯m
-
x¯¯¯¯¯m=(−1)m(−x)m––
-
Δ 算子(差分算子)
类似求导算子,我们定义差分算子 Δ,Δf(x)=f(x+1)−f(x)。
它不具有求导算子那样优美的性质,但是其对于下降幂来说,与求导的运算法则相同。具体的,Δ(xm––)=mxm−1––––––。
可以发现,差分算子和求导算子十分相似,他们也有一些比较相似的性质,例如: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)=11−x
我们称 11−x 为 f(x) 的封闭形式。上面计算生成函数封闭形式的做法称为错位相减,是小学数学常用的一种方法。
利用上面的算法,可以求出下面几个生成函数的封闭形式:
-
{1,1,1,1⋯}OGF⟶11−x
-
{1,a,a2,a3⋯}OGF⟶11−ax
-
{1,xk,x2k,x3k⋯}OGF⟶11−xk
-
{1,c1xk,c2x2k⋯}OGF⟶11−cxk
-
{0,1,12,13⋯}OGF⟶−ln(1−x)
-
{1,1,12!,13!⋯}OGF⟶ex
-
{1,1,1⋯}OGF⟶11−x
f(x)=∞∑f(x)(i)i!
上面的式子称为麦克劳林展开。注意,上面的式子没有考虑到 f 的敛散性。
通过麦克劳林展开,我们可以得到几乎所有函数的展开式。
利用上面得到的重要结论
f(x)=11−x=∑xi
将其中的 x 换成 qx,可以得到:
f(x)=11−qx=∑qixi
可以使用还原得到一些其他结论。
Example 5.1 求 f(x)=31−4x 的展开形式。
f(x)=311−4x=3∑4ixi
Example 5.2 求 f(x)=11+x 的展开式。
f(x)=11−(−x)=∑(−1)ixi
Example 5.3 求 f(x)=53−4x 的展开式。
f(x)=5/31−4/3x=53⋅11−43x=53∑(43)ixi
可以发现,这个方法非常好用。它可以展开几乎一切分母为一次的分式。
上面的换元法非常好用,但是只适用于 −1 次的式子。对于高次的式子,我们尝试将他变成 −1 次的进行解决。
Example 5.4 求 f(x)=1x2−4x+3 的展开式。
考虑到分母可以表示成 (1−x)(3−x) 的形式,我们尝试裂项。
不妨设 f(x)=1(1−x)(3−x)=A1−x+B3−x 的形式。
可以发现,A1−x+B3−x=A(3−x)+B(1−x)(1−x)(3−x)
于是有 A(3−x)+B(1−x)=1。解这个方程,得到:
A=1/2,B=−1/2
对于分母更高次的情况,只要有实根,就可以裂项降次。
这个方法用于补裂项法的坑。
有的时候,分母是高次方程且没有实根,这非常不好,因为没法裂项。这时候可以使用这个方法。
Example 5.5 求 f(x)=11−2x+7x2 的展开形式。
我们发现对于分母,Δ=4−28<0,因此没有实根,无法裂项。
考虑设 f(x)=11−2x+7x2=a0+a1x+a2x2⋯
则有
(1−2x+7x2)(a0+a1x+a2x2⋯)=1
做一下这个卷积,可以得到
a0=1a1−2a0=0a2−2a1+7a0=0⋯
因此,a0=1,a1=2,对于 n>1,an=2an−1−7an−2。这样我们得到一个递推形式。
利用特征根方程即可求出该递推式的通项。
学了上面这么多展开技巧,我们来举几个实际例子。
Example 5.6 斐波那契数列通项
定义 f0=0,f1=1,∀n≥2,fn=fn−1+fn−2。求 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 x≥2)。对于 x<2,我们强行补上即可。所以得到:
F(x)−xF(x)−x2F(x)=1
F(x)=11−x−x2
这样我们得到了 F(x) 的封闭形式。
接下来我们要对这个封闭形式进行展开。发现分母有实根,这非常好。我们求出它的两个实根,分别为
x1=−1−√52,x2=−1+√52
采用展开技巧中的裂项法对他进行裂项,得到
F(x)=Ax1−x+Bx2−x
可以解得 A=√55,B=−√55。
将 A,B 代入并进行一顿化简(化简过程使用换元法)后,可以得到斐波那契数列的通项公式:
fn=√55[(1+√52)n−(1−√52)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,2 或 3 个。
-
G:只能购买 ≤1 个。
-
H:只能购买 3 的倍数个。
求购买 n 个物品的方案数。n≤10500,答案对 10007 取模。
做法一:背包。设 fi 表示选择了 i 个物品的方案数。转移即可。
做法二:流氓算法。使用背包打表,用 BM 弄出通项。
做法三:使用生成函数。
我们考虑每种物品的生成函数对应的是什么。对于 A 物品,不妨将其生成函数设为 A(x),后面同理。
-
A(x)=1+x2+x4+⋯=11−x2
-
B(x)=1+x=1−x21−x
-
C(x)=1+x+x2=1−x31−x
-
D(x)=x+x3+x5+⋯=x1−x2
-
E(x)=1+x4+x8+⋯=11−x4
-
F(x)=1+x+x2+x3=1−x41−x
-
G(x)=1+x=1−x21−x
-
H(x)=1+x3+x6+⋯=11−x3
把这些东西乘起来消消乐,剩下的答案就是:
x(1−x)4
这样我们得到了封闭形式。展开就可以得到答案。我们尝试对这个东西进行展开。利用广义二项式定理,我们可以得到:
1(1−x)4=∑i=0(−4)i–i!(−x)i=∑i=0(−4)i–(−1)ii!xi=∑i=04¯ii!xi=∑i=0(3+i)i–i!xi=∑i=0(3+ii)xi
乘上 x 相当于对其施以平移算子,答案即为
(n+2)(n+1)n6
Bonus:最后对于 1(1−x)4 的化简,其实有更简单的方法。
对于 11−x 求三阶导,发现就等于 1(1−x)4。
Example 6.2 P2000 拯救世界
和上一题差不多,列出来十个生成函数,乘起来消消乐就可以了。
Example 6.3 Super Poker II
写出四种扑克的 OGF,乘起来就可以了。由于没有绑账号所以没有写。
- 对 F(x) 乘以 A(x)=1+x+x2+x3⋯,可以求出 F(x) 的前缀和。例子:差分与前缀和
指数型生成函数(EGF),通常用于有标号方案计数,如图计数等。
对于数列 P,其 EGF 定义为:
∑i=0Pii!xi
下面是一些常见数列的 EGF。
-
{1,1,1,1⋯}EGF⟶ex
-
{1,−1,1,−1⋯}EGF⟶e−x
-
{1,c,c2,c3⋯}EGF⟶ecx
-
{1,0,1,0⋯}EGF⟶ex+e−x2
-
{1,a,a2,a3,a4⋯}EGF⟶(1+x)a
上述推导可以直接在 0 处泰勒展开。
Example 8.1
n 个点的无向连通图计数。
设 B=∑2(i2)xi,表示无向图的方案数。
设 A=∑fixi,表示无向连通图方案数。
则有 B=eA,将 B 取 ln 可以得到 A。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示