生成函数浅谈

羊驼说,要当老师,所以强大的羊驼教会了我们生成函数。

羊驼说,我们有卷积,所以生成函数的问题通常可以在带 log 的时间复杂度内解决这类问题。

普通型生成函数

数列 1,1,1,1,1,1 的普通型生成函数就是 1+x+x2+x3+x4+x5

而数列 1,1,,1,1, 的普通型生成函数就是 1+x+x2+x2++xn+

羊驼说,写成展开形式形式太麻烦,所以羊驼教会了我们封闭形式。

F(x)=1+x+x2+x3+x4+x5

xF(x)=x+x2+x3+x4+x5+x6

所以 F(x)=1x61x

对于无穷数列也是同理,我们可以假定它收敛,得到封闭形式。

F(x)=1+x+x2+

xF(x)=x+x2+x3+

所以 F(x)=11x

下面是一些常用的无穷数列普通型生成函数的封闭形式和展开形式的对应关系:

ai=pi[xi],F(x)=11px

ai=[xpi],F(x)=11xp

ai=(i+1)[xi],F(x)=1(1x)2

ai=(mi)[xi],F(x)=(1+x)m

ai=(i+m1m1)[xi],F(x)=1(1x)m

指数型生成函数

羊驼说,她不会组合数,所以就有了指数型生成函数。

1,1, 的指数型生成函数就是 1+x+x22!+x33!+

指数型生成函数通常用来消掉组合数中的阶乘,并且一般是无穷数列。

对于指数型生成函数的封闭形式和展开形式来说,二者对应关系如下:

f(x)=i=0f(i)(0)[xi]i!

因此,指数型生成函数的封闭形式通常是 e 的幂次。

下面是一些常用的无穷数列指数型生成函数的封闭形式和展开形式的对应关系:

ai=[xi]i!,F(x)=ex

ai=(1)i[xi]i!,F(x)=ex

ai=[x2i]2i!,F(x)=ex+ex2

ai=[x2i+1](2i+1)!,F(x)=exex2

于是我们就学会了生成函数。

例题

羊驼说,要有例题,所以我们来到了 P2000 拯救世界

两位大神的召唤方法显然都可以写成封闭形式,只要约一下分,就可以得到最终的封闭形式。

kkksc03

金:F(x)=11x6

木:F(x)=1x101x

水:F(x)=1x61x

火:F(x)=11x4

土:F(x)=1x81x

lzn

金:F(x)=11x2

木:F(x)=1x21x

水:F(x)=11x8

火:F(x)=11x10

土:F(x)=1x41x

乘起来可得:

F(x)=1(1x)5

再转换回展开形式:

F(x)=i=0(i+5151)[xi]

答案即为 (n+44)

可以用 NTT 加速高精度。

羊驼说,这种板子题太简单,所以就有了 P4841 城市规划

我们枚举 1 节点所在的连通块大小,设 f(x) 是合法连通图数量,g(x) 是合法图数量,则可得 g(n)=i=1n(n1i1)f(i)g(ni)

同时我们已知 g(n)=2(n2),开始推柿子。

2(n2)=i=1n(n1i1)f(i)2(ni2)2(n2)(n1)!=i=1nf(i)(i1)!2(ni2)(ni)!

写出生成函数:

F(x)=i=1f(i)(i1)![xi]

G(x)=i=12(i2)(i1)![xi]

H(x)=i=02(i2)i![xi]

H=FG

多项式求逆即可。

斐波那契通项公式

绝帆看到没有斐波那契通项公式,非常不满,所以连夜来补一下。

我们知道斐波那契的递推式是 fn=fn1+fn2

写成生成函数的形式:fn[xn]=fn1[xn1]+fn2[xn2]

接下来就是推柿子:

F(x)=F(x)x+F(x)x2+1

F(x)=11xx2

要求通项公式,下一步就应该要展开了,但是我们背的展开公式中并没有这个,所以要想办法变为见过的样子。

分母处是一个二次多项式,看起来能拆成 (1p1x)(1p2x) 的形式,那么试一下。

Δ=b24ac=5,所以 p1=1+52,p2=152

得到 11xx2=1+52511+52x+15251152x=15(1+52111+52x+15211152x)

现在拆项,得到 fn=15((152)n+1+(1+52)n+1)

如果必要需要扩域。

泰勒展开

如果 f(x)x0 处存在 n 阶导,那么有 f(x)=f(x0)+f1(x0)1!(xx0)+f2(x0)2!(xx0)2++fn(x0)n!(xx0)n+ξ

ξ 是余项,在 n 趋近于 的时候趋近于 0

x0=0 的 Taylor 展开又被称作麦克劳林级数。

多项式运算之牛顿迭代

一个多项式运算可以看作求解 F(B(x))0modx2t,令 Bt 表示一个合法解,t=0 时可以简单算出,考虑用 Bt 求出 Bt+1

利用 F(Bt+1(x))Bt(x) 处的泰勒展开,得到 F(Bt+1(x))F(Bt(x))+F(Bt(x))1!(Bt+1(x)Bt(x))modx2t+1,后面的项数模意义下为 0,不用管。

化简得 Bt+1(x)Bt(x)F(Bt(x))F(Bt(x))modx2t+1,倍增计算即可。

多项式求逆

F(B(x))=A(x)B(x)1 模意义下为 0

Bt+1(x)=Bt(x)F(Bt(x))F(Bt(x))=Bt(x)At+1(x)Bt(x)1At+1(x)=Bt(x)Bt(x)(At+1(x)Bt(x)1)=2Bt(x)At+1(x)Bt2(x)

多项式开根

F(B(x))=B2(x)A(x) 模意义下为 0

Bt+1(x)=Bt(x)F(Bt(x))F(Bt(x))=Bt(x)Bt2(x)At+1(x)2Bt(x)=12(Bt(x)At+1(x)Bt(x))

多项式 exp

F(B(x))=ln(B(x))A(x) 模意义下为 0

Bt+1(x)=Bt(x)F(Bt(x))F(Bt(x))=Bt(x)ln(Bt(x))At+1(x)1Bt(x)=Bt(x)(1ln(Bt(x))+At+1(x))

更多技巧

  1. 多个式子的乘积不好做,求 ln 加起来,再求 exp。

付公主的背包

显然一个物品的生成函数是 11xvi,现在我们需要把它乘起来求第 m 项的系数。

发现 i11xvi 非常不好做,可以先求 ln 相加,再用 NTT exp 回去。

f(x)=ln11xv=lni=0xvi,那么 f(x)=(1xv)(i=1vi×xvi1)=i=1v×xvi1,最后积分得 f(x)=i=1xvii

还有更神仙的做法,因为 ln(1+x) 的麦克劳林级数是 i=1(1)i+1ixi,所以 ln11+x 的麦克劳林级数是 i=1(1)iixi,把 x 代换为 xvln11xv=i=1xvii

posted @   mikefeng  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示