多项式计数杂谈 - command_block 的博客 学习总结

二项式

  • (1) 拆开组合数

(nm)=n!m!(nm)!

组合意义就是总共有 n 个物品,我们选择 m 个出来的方案数。

根据组合意义,我们需要有 0mn 才能保证成立。

一些推论

  1. 对称性 (nm)=(nnm)

  2. 吸收恒等式 (nm)=nm(n1m1)

  • (2) 经典二项式定理

(x+y)k=i=0k(ki)xiyki

注意 1 的幂可能隐藏在求和中。

  • (3) 递推公式

(nm)=(n1m)+(n1m1)

证明的话就是考虑新加入一个数到底是放不放的情况。

对于更加复杂的二项式的形式,我们可以考虑通过拆开进行递推得到答案。

一些推论

  • 平行求和

i=0n(r+ii)=(r+n+1n)

  • 上指标求和

i=0n(im)=(n+1m+1)

  • 下指标求和

i=0n(ni)=2n

  • 对称性

奇数项和偶数项分别等于 2n1

2n1=i=0n2(ni)+12×(nn2)[n is even]

  • (4) 范德蒙德卷积

i=0k(ni)(mki)=(n+mk)

本质上就是 (1+x)n×(1+x)m=(1+x)n+m

或者从组合意义上理解也是一样的,就是在两个集合选 k 个数的方案。

  • (5) 广义二项式系数 + 广义二项式定理

定义广义二项式系数(nm)=nmm!

这样我们就有:

(x+y)a=i0(ai)xiyai

广义二项式定理衍生技巧

  • 上指标反转

(nm)=(mn1m)(1)m

  • 取一半:处理 (2nn) 形组合数。

我们考虑两个下降幂的乘积:

xk(x12)k=x(x12)(x1)(xk+1)(xk+12)

考虑加倍操作得到:

xk(x12)k×122k=(2x)2k22k

我们两边同时除以 (k!)2 得到:

(xk)(x12k)=(2x2k)(2kk)×122k

说句实话这里 commandblock 写错了。

考虑带入 x=n,k=x 可以得到等式:

(n12n)=(2nn)×122n

也就是:

(12n)×22n×(1)n=(2nn)

最终得到:

(12n)×(4)n=(2nn)

可以求出 i=0(2ii)zi 的封闭形式:

i=0(12i)×(4z)i=(14z)12

  • (6) 下降幂和上升幂的二项式定理

(x+y)a=i=0n(ni)xiyai(x+y)a=i=0n(ni)xiyai

  • (7) 二项式反演

二项式反演

  • (8) 差分和前缀和

前缀和:乘以一个全是 1 的多项式,也就是 11z

差分:乘以 1z

  • (9) 牛顿级数

暂时不是很会,等会了再说,感觉不是很难。

  • (10) 生成函数和杨辉三角

考虑二元生成函数的形式:

G[n,m]=(nm)G(x,y)=i=0j=0(ij)xiyjG(x,y)=i=0xi(y+1)iG(x,y)=i=0(xy+x)iG(x,y)=11xxy

y=xk

G(x,y)=[xn]i=0j=0(ij)xiyj=[xn]i=0j=0(ij)xixjk=i+jk=n(ij)

同理如果 x=yk 同样可以得到 [xn]G(x,y)=ki+j=n(ij)


生成函数技巧

  • (1) 特征方程

如果有递推方程 f(n)=af(n1)+bf(n2)

x2=ax+b 解得两个根 x0,x1

我们断言 f(n)=Ax0n+Bx1n

我们带入初始给定的值即可解得方程。

  • (2) 构造系数的技巧
  1. 平移 [xn]F(x)xt=F[nt]

  2. 伸缩 F(xk)←<F[0],0,0,,0,0k1 个 0,F[1],0,0,,0,0k1 个 0>

  • (3) 生成函数系数的获取

考虑通过求导和平移用 F(x) 表示 F(x)x,然后得到与 F(x),F(x) 的递推式。

考虑将其表示成系数的形式显然有 F[n]=(n+1)F[n+1]

带入即可得到递推式。

可以考虑例题 [MtOI2018] 情侣?给我烧了!(加强版)

其中求 D(x) 的时候可以使用该方法。

所以我才能切了这题。

当然如果你得到通向了之后可以暴力展开。


或者考虑对于比较复杂的部分 C+xx 这样的情况,我们可以考虑分步进行计算。

考虑设 G(x)=x 我们先求出 G 的递推式,之后可以得到 F 关于 G 的式子,之后就可以直接得出答案了。

例题 1

F(x)=1x16x+x22x

求其递推式。

G(x)=16x+x2

可以知道 G(x)=12(16x+x2)12×(6+2x)

我们两边同时乘以 16x+x2

可以得到 G(x)(16x+x2)=G(x)×(x3)

也就是 g[n]6g[n1]+g[n2]=g[n1]3g[n]

根据我们之前的式子 g[n]=g[n+1](n+1)

可以知道 g[n+1](n+1)6ng[n]+(n1)g[n1]=g[n1]3g[n]

整理之后得到:

g[n+1](n+1)(6n3)g[n]+(n2)g[n1]=0g[n+1]=1n+1(6n3)g[n](n2)g[n1]

初值什么的就自己看了。

之后考虑 F(x)=1xG(x)2x

可以得到 2xF(x)=1xG(x)

发现前面的 1x 本质上只和 f(1) 有关。

所以得到 2f(n)=g(n+1)

  • (4) 生成函数的组合意义
  1. exp 表示有标号无交集合 (EGF) 的拼接,注意我们可以通过钦定根的情况直接使用 exp 来得到一些有根的图或者树。

  2. ln 这个就是 exp 的逆操作同样也是 (EGF),也就是将一个集合分成若干个不相交的集合,常见的应用就是将无向图变成连通的。

这个操作应该是由连通图推到无向图,之后再取对数得到的。

而不是本来 ln 的意义!!

  1. 对于 OGF 加法和乘法的意义
  • 加法:本质就是两个不相交集合的并。

  • 乘法:本质就是两个不相交集合的笛卡尔积。

  • (5) 多项式复合

直接举一个例子,设 F(z)=i0zii!

那么显然有 F(G(z))=i0Gi(z)i!,也就是将原来的 z 替换成了 G(x)

例题:大朋友和多叉树

我们考虑使用生成函数 [zn]F(z) 表示权值为 n 的答案。

我们考虑转移的时候要么是可以直接增加一个叶子节点贡献是 1,要么是按照题目要求枚举一下度数进行乘积。

可以得到方程 F(z)=z+dDegFd(z)

我们移项得到 F(z)dDegFd(z)=z

我们设 G(z)=zi0[dDeg]zi

直接带入得到 G(F(z))=x。根据下文的拉格朗日反演可以得到答案。

  • (6) 解决复合的方法 拉格朗日反演

网上证明还是比较多的,就不证明了。

留作练习。

如果有 F(G(z))=G(F(z))=x。不妨拿 F(G(z)) 当做例子,我们可以得到:

G(z)=1n[zn1](zF(z))n

注意 我们不能只拘泥于这种形式,其本质是:

G(z)=1n[z1]1Fn(z)

我们上面进行平移是为了保证其能用整数来表示出来,注意我们对于 F 需要进行平移直到第一项非零为止,所以这个 1 本质上就是减去向左平移的位置,之后 n 就是单纯来平衡的。

证明的话考虑我们之前说的,对于复合之后的函数进行求导和平移即可。

  • (7) 解决复合的方法 扩展拉格朗日反演

主要是感觉写到一起不是很明显,但是事实上这个东西的用处更大一些。

H(F(z))=1n[zn1](zG(z))nH(z)

  • (8) 常用的多项式形式

11z=i0ziez=i0zii!1(1z)m=i0(i+m1i)ziez+ez2=i0z2i(2i)!ezez2=i0z2i+1(2i+1)!11z=ln11z=i1zii11+z=ln(1+z)=i1(1)i1zii

其实我们还可以将 z 替换成 az 这样就变成了 aizi 了。

  • (9) 生成函数求通向

根据上文的一些套路,您肯定可以将一些简单的递推式子得到通向了。

但是如果比较复杂怎么办,比如说斐波那契数列就是我们不能直接看出来的数列。

当然您可以通过我们最早提起的特征方程来解决这个问题。

我们知道 Fib(z)=z1zz2

  • (1) 直接拆分成和 z 一次项有关的式子

Fib(z)=z1zz2=15(11152z+115+12z)

发现里面的式子本质上和 11az 是一样的,根据加法原理我们直接可以得到:

Fib(z)=15((152)n+(1+52)n)

  • (2) 使用牛顿二项式定理

我们考虑一个常见的卡特兰数的生成函数 C(z)=114z2z

我们不用考虑左边的部分直接使用牛顿二项式定理展开 14z

14z=i0(12i)(4zi)=i0(2i2)!(i1)!22i1i!4izi=2i0(2i2)!(i1)!i!ziC(z)=i0(2ii)i+1zi

我们注意一下,我们对于 14z 可以拆出来第一项与 1 相消除。

  • (3) 构造拉格朗日反演的形式

上面的那种太麻烦了,我们能不能有快一点的做法。

对于卡特兰数有 C(z)=1+zC2(z) 成立,我们考虑直接进行构造。

首先进行移项得到 C(z)1C2(z)=z 已经符合了反演的一个条件,很简单我们构造 F(z)=z1z2 即可,那么 F(C(z))=z 进行反演得到。

C(z)=1n[zn1](zF(z))n=1n[zn1](z3z1)n

右边进行展开可以得到:

(z3z1)n=z3ni0(i+n1i)(1)izi[zn1](z3z1)=(n22n1)×(1)2n1

但是你会发现二项式系数下面是 2n1 是不行的,我们考虑对于原来的 F 稍作改动。

也就是需要将 z1 消掉即可,很简单我们让 z1z 也就是让 z1

F(z)=z(1+z)2 那么我们有 F(C(z)1)=z

(C(z)1)=1n[zn1](zF(z))n=1n[zn1](z+1)2n=(2nn1)n=(2nn)n+1

其实常数项 1 并不可怕,可怕的是 2

  • (4) 利用卷积和组合意义

例题:n 个点的有根树的数量。

设答案的生成函数为 T(z)

显然我们可以考虑对于树进行拼接。

T(z)=zeT(z)

显然可以得到 T(z)eT(z)=zF(z)=zez 那么有 F(T(z))=z

根据拉格朗日反演可以得到 [zn]F(z)=1n[zn1]ezn

F(z)=1n[zn1]ezn=1n×nn1(n1)!

但是我们是 EGF 需要再额外乘以一个 n!

所以答案就是 n!×nn1n!=nn1