2025.7.15 生成函数

本篇涉及多种多项式优化技术,如果你还没有掌握,请去拷贝一份好用的多项式全家桶板子.

前言

生成函数是组合计数领域尤其重要的一部分,虽然其不能直接计数,但是其应用相当广泛,也可以为许多计数题提供宝贵的思路. 在结合符号化方法后,生成函数更是神挡杀神. 毕竟生成函数的求解相比于其它人类智慧方法还是更加有迹可循的,所以生成函数的学习非常有必要,并且最好应该熟练掌握.

普通生成函数 OGF

定义

我们定义序列 \(<a_0,a_1,a_2\cdots>\)普通生成函数 \(A(x)\) 为形式幂级数

\[A(x)=\sum_{n\ge0}a_nx^n \]

同时 \(A(x)\)系数 \(a_n\) 写作

\[a_n=[x^n]F(x) \]

依据定义,\(A(x)\) 实际上是一个有无穷项的多项式,而 \(a\) 既可以是又穷序列也可以是无穷序列.

基本运算

依据多项式的基本运算,对于 OGF \(A(x),B(x)\) 也有

\[A(x)\pm B(x)=\sum_{n\ge0}a_nx^n\pm \sum_{n\ge0}b_nx^n =\sum_{n\ge0}(a_n\pm b_n)x^n \]

\[A(x) B(x)=\sum_{n\ge0}\sum_{i+j=n}a_ib_jx^n=\sum_{n\ge0}\sum_{i=0}^na_ib_{n-i}x^n \]

其中生成函数 \(A(x),B(x)\)卷积定义就定义为 \(A(x)B(x)\)。卷积有着非常重要的组合意义,我们将在下文进一步探讨.

OGF 系数的左移和右移直接对应下标的左移右移,也就是除以或乘以一个 \(x\).

封闭形式

生成函数的一大特点就是其通常具有形式简单的封闭形式,这样可以使化简变得更加轻松.

一般地,生成函数的封闭形式就是利用其系数和项数无穷的性质把其转换为有限项的恒等形式。譬如 \(<1,1,1,\cdots>\) 的普通生成函数 \(F(x)\) 有封闭形式

\[F(x)=\sum_{n\ge0}x^n={1\over 1-x} \]

具体的推导我们发现 \(F(x)x\) 对应序列 \(<0,1,1,\cdots>\),所以有

\[xF(x)+1=F(x)\iff F(x)={1\over1-x} \]

类似地,等比数列 \(<1,p,p^2,\cdots>\) 的生成函数 \(F(x)\) 有封闭形式

\[F(x)=\sum_{n\ge0}p^nx^n=F(x)px+1\iff F(x)={1\over1-px} \]

值得一提的是,由于封闭形式与形式幂级数是恒等的,所以一些对于形式幂级数的操作也可以很直观地反映在封闭形式上,遇到时要灵活应对,如

\[c\cdot F(x)=\sum_{n\ge0}cp^nx^n={c\over1-px} \]

提取系数

对于已知的封闭形式,我们可以尝试提取系数来反向得到序列.
我们将以斐波那契数列的 OGF 为例来介绍提取系数的方法之一——待定系数法.

考虑斐波那契数列 \(a_0=0,a_1=1,a_n=a_{n-1}+a_{n-2}(n>1)\),观察到

\[\begin{aligned} F(x)&=a_0x^0+a_1x^1+a_2x^2+a_3x^3+a_4x^4+\cdots\\ xF(x)&=\ \ \ \ \ \ \ \ +a_0x^1+a_1x^2+a_2x^3+a_3x^4+\cdots\\ x^2F(x)&=\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +a_0x^2+a_1x^3+a_2x^4+\cdots\\ \end{aligned} \]

根据递推式,发现补上 \(xF(x),x^2F(x)\) 的前面几项就可以相加直接得到 \(F(x)\). 所以 \(F(x)\) 有封闭形式

\[xF(x)+x^2F(x)-a_0+a_1x+a_0=F(x)\iff F(x)={x\over1-x-x^2} \]

考虑用一定的形式来设出系数,比如

\[{A\over1-ax}+{B\over1-bx}={x\over1-x-x^2} \]

注意两边必须是齐次的.
接下来通分、根据系数恒等列出方程、求解方程,得到

\[{A-Abx+B-aBx\over(1-ax)(1-bx)}={x\over1-x-x^2} \]

\[\begin{cases} A+B=0\\ -Ab-aB=1\\ a+b=1\\ ab=-1 \end{cases} \]

\[\begin{cases} A={1\over\sqrt5}\\ B=-{1\over\sqrt5}\\ a={1+\sqrt5\over2}\\ b={1-\sqrt5\over2} \end{cases} \]

上面我们假设的封闭形式是等比数列之和,所以我们就可以带入得到

\[F(x)={x\over1-x-x^2}=\sum_{n\ge0}{1\over\sqrt5}\Big(\Big({1+\sqrt5\over2}\Big)^n-\Big({1-\sqrt5\over2}\Big)^n\Big) \]

我们就得到了斐波那契数列的通项公式.

组合意义

OGF 卷积的组合意义是把物品组合起来,可以用来解决无标号的计数问题.

P4451 [国家集训队] 整数的lqp拆分

Hint:答案即斐波那契生成函数的生成函数

我们知道斐波那契生成函数的封闭形式为 \(F(x)={x\over1-x-x^2}\). 要求的答案下标之和一定,各项相乘,这不就是生成函数的卷积吗?拆分成 \(k\) 个数的答案为 \(F(x)^k\),拆成若干个数即对所有 \(k\) 求和,可以写出生成函数:

\[G(x)=\sum_{i\ge0}F(x)^i \]

同时易得答案:

\[ans=[x^n]G(x) \]

而把 \(F(x)\) 当作一个整体,会发现这其实是我们熟知的最一般的生成函数. 所以 \(G(x)\) 就有封闭形式:

\[G(x)={1\over1-F(x)}={1-x-x^2\over 1-2x-x^2}=1+{x\over 1-2x-x^2} \]

现在考虑对封闭形式提取系数,这里将采用更加严谨的说明.

提取系数要先展开封闭形式,这意味着我们要把式子化成基本的可以展开的封闭形式,如:

\[{1\over1-x}=\sum_{i\ge0}x^i \]

\[{c\over1-px}=\sum_{i\ge0}c\cdot (px)^i \]

等等.

所以分母的二次三项式考虑直接暴力求根因式分解,得到 \(x_1,x_2=1\pm\sqrt2\),且:

\[{x\over 1-2x-x^2}={-x\over(x-x_1)(x-x_2)} \]

我们需要把 \(x_1,x_2\) 拆成两项再展开:

\[\begin{aligned} &={x\over x_2-x_1}\left({1\over x_2-x}-{1\over x_1-x}\right)\\ &={x\over x_2-x_1}\left({1\over x_2}\cdot{1\over 1-{x\over x_2}}-{1\over x_1}\cdot{1\over 1-{x\over x_1}}\right) \end{aligned} \]

其中两项 \({1\over 1-{x\over x_2}}\)\({1\over 1-{x\over x_1}}\) 可以直接展开,同时把常数项提出来,有:

\[\begin{aligned} &={x\over x_2-x_1}\left({1\over x_2}\cdot\sum_{i\ge0}{x^i\over x_2^i}-{1\over x_1}\cdot\sum_{i\ge0}{x^i\over x_1^i}\right)\\ &={1\over x_2-x_1}\left(\sum_{i\ge0}{x^{i+1}\over x_2^{i+1}}-\sum_{i\ge0}{x^{i+1}\over x_1^{i+1}}\right)\\ \end{aligned} \]

所以这玩意是可以直接算的,答案即为:

\[g(n)={1\over x_2-x_1}\left({1\over x_2^{n}}-{1\over x_1^{n}}\right)={\sqrt2\over4}\left({1\over (1+\sqrt2)^n}-{1\over (1-\sqrt2)^n}\right) \]

暴力算一下 \(2\)\(\bmod10^9+7\) 意义下的二次剩余和 \(4\)\(\bmod10^9+7\) 意义下的乘法逆元即可快速计算.

另外根据费马小定理实际上 \(x^{p-1}\equiv 1\pmod p,while\ x\perp p\). 所以可以手写个输入把 \(n\)\(10^9+6\) 取模,而不需要高精度.

P4841 [集训队作业2013] 城市规划

Hint:考虑容斥,随便连边的方案数减去不连通的方案数,或者考虑 EGF.

EGF 做法将在下文讲解,实际上理解难度更低.

\(n\) 个点有标号无向连通图的方案数为 \(f_n\),有标号一般无向图的方案数为 \(g_n\). 一般无向图可以任选两个点连边,所以易得:

\[g_n=2^{n\choose 2} \]

一个有标号无向连通图的经典容斥是固定一个点,考察这个点所在连通块的大小,那么就要在剩下 \(n-1\) 个点选一些出来与其拼在一起,剩下的点强制不与连通块连边. 于是答案就是两部分乘起来,有递推式:

\[g_n=\sum_{i=1}^{n}{n-1\choose i-1}f_{i}g_{n-i} \]

会发现每个点所在的每种可能连通块其实都考虑到了,所以是不重不漏的.

观察到右边的下标是形如卷积的形式,于是考虑把组合数拆开凑生成函数卷积:

\[\begin{aligned} \sum_{n\ge0}g_nx^n&=\sum_{n\ge0}\sum_{i=1}^n{(n-1)!\over(i-1)!(n-i)!}f_ig_{n-i}x^n\\ \sum_{n\ge0}{g_n\over(n-1)!}x^n&=\sum_{n\ge0}\sum_{i=1}^n{f_i\over(i-1)!}{g_{n-i}\over(n-i)!}x^n\\ \end{aligned} \]

于是设

\[F(x)=\sum_{i\ge0}{f_i\over(i-1)!}x^i,\ G(x)=\sum_{i\ge0}{g_i\over i!}x^i,\ G'(x)=\sum_{i\ge0}{g_i\over(i-1)!}x^i \]

就有

\[G'(x)=F(x)\cdot G(x)\iff F(x)=G'(x)\cdot G^{-1}(x) \]

\(G(x)\)\(G'(x)\) 都是容易直接算出来的,所以对 \(G(x)\) 做一次求逆,再对 \(G^{-1}(x)\)\(G'(x)\) 做一次卷积,再还原出 \(f_i\) 即可.

指数生成函数 EGF

定义

一个序列 \(a_i\) 的指数生成函数定义为 \(\sum \limits_{i\ge0}{a_i\over i!}x^i\),也就是在 OGF 的基础上除以了 \(i!\) .

常见级数与基本运算

序列 \(\langle 1,1,\cdots,1\rangle\) 的指数生成函数是

\[\sum\limits_{i\ge0}{x^i\over i!} \]

会发现这其实是 \(e^x\) 的泰勒展开(这也是名称中“指数”的由来).

还有一些常见的序列的封闭形式:

\[\langle1,-1,1,-1\cdots\rangle\Rightarrow e^{-x}\\ \langle c^0,c^1,c^2,\cdots\rangle\Rightarrow e^{cx}\\ \langle1,0,1,0,1\cdots\rangle\Rightarrow {e^x+e^{-x}\over2}\\ \langle1,a^{\underline 1},a^{\underline 2},a^{\underline 3},\cdots\rangle\Rightarrow {(1+x)^a}\\ \]

EGF 的卷积,根据定义展开可得:

\[A(x)\cdot B(x)=\sum_{n\ge0}\sum_{i=0}^n{n\choose i}a_ib_{n-i}x^n \]

而 EGF 系数的左移,右移分别对应多项式求导,积分. 根据定义式易得,在这里留给读者自己证明.

组合意义

EGF 卷积的组合意义是物品的排列,可以解决有标号的计数问题.

而对组合对象(\(x,F(x)\) 等等)求 EGF,根据上文,展开后就是对组合对象求 exp. 所以我们也可以说 exp 的组合意义是有标号物品的排列.

下面用几道例题来具体介绍.

P4841 [集训队作业2013] 城市规划

Hint:exp 直接秒.

将有标号无向连通图视为基本组合对象,有标号一般无向图就是若干个有标号无向连通图的排列. 沿用先前的记号,有:

\[G(x)=\exp F(x)\iff F(x)=\ln G(x) \]

注意这里的 \(F(x)\)\(G(x)\) 都是 EGF,求出来记得还原回去.

P7364 有标号二分图计数

Hint:考虑用 exp 构建连通和不连通的有标号二分图的生成函数的关系.

一般图的限制很弱,所以先考虑直接枚举选 \(i\) 个点来作为左部点,一共 \(i(n-i)\) 条边任意连,有:

\[f_n=\sum_{i=0}^n{n\choose i}2^{i(n-i)} \]

然后你会发现这里面有大量算重的方案,因为二分图其实没有严格限制左右的先后顺序,但是这里却蕴含了黑白染色状的顺序,然而实际上黑色白色是等价的. 一般图每个连通块被算重的次数不好具体反映到式子中,所以考虑 \(f_n\) 的 EGF \(F(x)\) 转成 \(\ln F(x)\) 来通过单个连通块考虑. 单个连通块考虑起来就简易多了,显然算重了两次,于是有标号连通二分图的方案数即为:

\[{1\over 2}\ln F(x)\iff \ln\sqrt{F(x)} \]

而我们要求的有标号一般二分图的 EGF 只需要再 exp 回去,也就是:

\[\exp\left(\ln\sqrt{F(x)}\right)\iff\sqrt{F(x)} \]

至于 \(F(x)\) 的求法,可以使用一个恒等式

\[ab={a+b\choose 2}-{a\choose 2}-{b\choose 2} \]

来把 \(2\) 的指数拆开,化成卷积的形式,利用多项式技术快速求. 具体地:

\[\begin{aligned} \sum_{n\ge0}f_nx^n&=\sum_{n\ge0}\sum_{i=0}^n{n!\over i!(n-i)!}2^{{n\choose2}-{i\choose2}-{n-i\choose 2}}x^n\\ \sum_{n\ge0}{f_n\over n!}x^n&=\sum_{n\ge0}2^{n\choose2}\sum_{i=0}^n{1\over2^{i\choose2} i!}\cdot{1\over2^{n-i\choose2} (n-i)!}x^n\\ F(x)&=\sum_{n\ge0}2^{n\choose2}\sum_{i=0}^n{1\over2^{i\choose2} i!}\cdot{1\over2^{n-i\choose2} (n-i)!}x^n\\ \end{aligned} \]

\[G(x)=\sum_{k\ge0}{1\over2^{k\choose2} k!}x^k \]

于是右式可以先用卷积把系数算一部分出来,再稍微算算就可以得到 \(F(x)\).

什么?你觉得 \(f_n\) 可以直接线性求?你也太可爱了. 我们要求 \(\le 10^5\) 的所有 \(f_n\),这样当然是不可以的.

当然如果你想当然认为可以暴力求 \(F(x)\) + 暴力多项式开根 + 打表通过此题,其实也是可以的哟.

P6295 有标号 DAG 计数

\(\le n\) 个点的有标号弱连通有向无环图(有向边替换为无向边后图连通)个数 \(\bmod \ 998244353\).

设有标号弱连通 DAG 方案数的 EGF 为 \(F(x)\),有标号 DAG 方案数的 EGF 为 \(G(x)\). 根据 exp 的组合意义是有标号组合对象的排列,由于弱连通 DAG 性质强于一般 DAG ,我们如果把弱连通 DAG 看做基本组合对象,其经过组合可以得到所有的一般 DAG. 也就是说我们有

\[G(x)=\exp F(x)\iff F(x)=\ln G(x) \]

所以如果我们可以求出 \(G(x)\) 的 EGF,再做一次多项式 \(\ln\) 就可以得到答案的 EGF.

接下来我们考虑表示出 \(G(x)\). 设 \(G(x)\) 系数为 \(g_i\),我们要尝试容斥出一个式子能够刻画 \(g_i\).
一个 DAG 计数的套路是我们可以钦定 DAG 中入度为 \(0\) 的点的个数,因为 DAG 中至少存在一个入度为 \(0\) 的点. 不妨设 \(h_{i,j}\) 表示 \(i\) 个点 DAG 钦定有 \(j\) 个点入度为 \(0\),其余点不作限制的方案数,\(c_{i,j}\) 表示 \(i\) 个点 DAG 钦定恰好有 \(j\) 个入度为 \(0\) 的方案数. 根据二项式反演我们可以表示出 \(h_{i,j}\)\(c_{i,j}\) 的关系有

\[h_{i,j}=\sum_{k=j}^i{k\choose j}c_{i,k}\iff c_{i,j}=\sum_{k=j}^i(-1)^{k-j}{k\choose j}h_{i,k} \]

考虑 \(h_{i,j}\) 中除开钦定的 \(j\) 个入度为 \(0\) 的点,剩下不做限制的 \(i-j\) 个点实际上构成了一个一般的 DAG,即 \(g_{i-j}\). 这两部分其中的 \(j\) 个入度为 \(0\) 的点可以向除开 \(j\) 个点本身的所有点随意连边,这是钦定入度为 \(0\) 带来的性质,所以在总共 \(j(n-j)\) 条边中可以任意选/不选,方案数就是 \(2^{j(n-j)}\). 所以有 \(h_{i,j}\)\(g_{i-j}\) 的关系式

\[h_{i,j}={i\choose j}2^{j(n-j)}g_{i-j} \]

\(\sum c_{i,j}\) 实际上包括了 \(i\) 个点可能构成的所有 DAG 的方案,也就是说 \(g_i\) 可以直接用 \(c_{i,j}\) 表示,有

\[g_i=\sum_{j=1}^ic_{i,j} \]

现在我们可以做一个代换,对上式用 \(h\) 表示 \(c\),再用 \(g\) 表示 \(h\),得到 \(g\)\(g\) 的关系即

\[\begin{aligned} g_n&=\sum_{i=1}^nc_{n,i}\\ &=\sum_{i=1}^n\sum_{j=i}^n(-1)^{j-i}{j\choose i}h_{n,j}\\ &=\sum_{i=1}^n\sum_{j=i}^n(-1)^{j-i}{j\choose i}{n\choose j}2^{j(n-j)}g_{n-j}\\ \end{aligned} \]

先想办法化简,考虑交换求和次序,凑二项式定理

\[\begin{aligned} g_n&=\sum_{j=1}^n{n\choose j}2^{j(n-j)}g_{n-j}\sum_{i=1}^j{j\choose i}(-1)^{j-i}\\ &=\sum_{j=1}^n{n\choose j}2^{j(n-j)}g_{n-j}(\sum_{i=0}^j{j\choose i}(-1)^{j-i}-{j\choose 0}(-1)^j)\\ &=\sum_{j=1}^n{n\choose j}2^{j(n-j)}g_{n-j}((1-1)^j-(-1)^j)\\ &=\sum_{j=1}^n{n\choose j}2^{j(n-j)}g_{n-j}(-1)^{j+1}\\ \end{aligned} \]

接下来我们的核心问题集中在处理 \(2^{j(n-j)}\) 这个离奇的式子上,实际上我们也可以先把 \({n\choose j}\) 拆开找找灵感

\[g_n=\sum_{j=1}^n{n!\over j!(n-j)!}2^{j(n-j)}g_{n-j}(-1)^{j+1} \]

如果您的注意力比较不错,就会发现拆开后两边 \(g\) 的下标都出现在阶乘里. 如果我们调整一下位置

\[{g_n\over n!}=\sum_{j=1}^n{(-1)^{j+1}\over j!}2^{j(n-j)}{g_{n-j}\over(n-j)!} \]

出现了 \(G(x)\) 系数的 EGF 形式!而且两边还是是同构的!
现在我们要把 \(2^{j(n-j)}\) 拆成易处理的,且同样含有 \(n,(n-j)\) 项的东西.
实际上有一个不太常见的凑式子 trick:\(j(n-j)={n\choose 2}-{j\choose 2}-{n-j\choose 2}\)。数值上易证.
所以就又可以继续化简:

\[\begin{aligned} {g_n\over n!}&=\sum_{j=1}^n{(-1)^{j+1}\over j!}{2^{n\choose2}\over2^{j\choose2}2^{{n-j\choose2}}}{g_{n-j}\over(n-j)!}\\ {g_n\over2^{n\choose2} n!}&=\sum_{j=1}^n{(-1)^{j+1}\over2^{j\choose2} j!}{g_{n-j}\over2^{n-j\choose2}(n-j)!} \end{aligned} \]

设 $$P(x)=\sum_{i\ge0}{g_i\over2^{i\choose2} i!}x^i$$

\[Q(x)=\sum_{i\ge1}{(-1)^{i+1}\over2^{i\choose2}i!}x^i \]

把上式两边同时看做 OGF 的系数,有

\[\begin{aligned} \sum_{n\ge 0}{g_n\over2^{n\choose2} n!}x^n&=\sum_{n\ge 0}\sum_{j=1}^n{(-1)^{j+1}\over2^{j\choose2} j!}{g_{n-j}\over2^{n-j\choose2}(n-j)!}x^n\\ P(x)&=\sum_{j=1}^n{(-1)^{j+1}\over2^{j\choose2} j!}x^j\sum_{n\ge0}{g_{n-j}\over2^{n-j\choose2}(n-j)!}x^{n-j} \end{aligned} \]

可以发现右式和 \(P(x)Q(x)\) 很像。根据卷积的定义,如果 \(A(x),B(x)\) 都是下标从 \(0\) 开始的生成函数,我们有

\[A(x)B(x)=\sum_{n\ge0}\sum_{i=0}^na_ib_{n-i}x^n \]

然而 \(Q(x)\) 下标是从 \(1\) 开始的,这意味着我们要调整第二个求和使其没有 \(q_0\) 这一项,即

\[P(x)Q(x)=\sum_{n\ge0}\sum_{i=0}^{n-1}p_iq_{n-i}x^n \]

发现将上界调整为 \(n-1\) 就可以解决这个问题.
接着我们再用 \(j=i+1\) 来作为指标使上式看起来更接近原式,有

\[P(x)Q(x)=\sum_{n\ge0}\sum_{j=1}^{n}p_{j-1}q_{n-j+1}x^n \]

这时候我们突然发现—— \(n=0\) 的这一项消失了!但是原式是有 \(g_0\) 这一项的. 我们要拿 \(P(x)Q(x)\) 替换原式就要补上 \(g_0\).

那么 \(g_0\) 应该是多少呢?我们回忆一下之前的一个式子

\[g_n=\sum_{j=1}^n{n!\over j!(n-j)!}2^{j(n-j)}g_{n-j}(-1)^{j+1} \]

容易得到 \(g_1=1\),因为一个点的 DAG 当然只有一种情况.
于是上式带入 \(n=1\),就得到了 \(g_0=g_1=1\)

于是前面的 \(P(x)\) 就被表示出来了!有

\[P(x)=P(x)Q(x)+1\iff P(x)={1\over1-Q(x)} \]

其中

\[P(x)=\sum_{i\ge0}{g_i\over2^{i\choose2} i!}x^i,\ Q(x)=\sum_{i\ge1}{(-1)^{i+1}\over2^{i\choose2}i!}x^i \]

\(Q(x)\) 可以直接 \(O(n\log n)\) 计算得到.

\(1-Q(x)\) 做一遍多项式求逆就得到了 \(P(x)\).

\(P(x)\) 处理一下就得到了 \(G(x)\) 的 EGF.

\(G(x)\) 的 EGF 做一遍多项式 \(\ln\) 就得到了 \(F(x)\) 的 EGF.

\(F(x)\) 的 EGF 转成 OGF 就可以得到答案.

posted @ 2025-07-17 21:42  Ydoc770  阅读(23)  评论(0)    收藏  举报