生成函数

生成函数

我理解为对某数列的一种描述/刻画

在生成函数中在生成函数中,\(x\) 代表的意义并非未知数,也不具有任何值,而仅仅是一个代数对象。关注 \(x\) 的值或 \(F(x)\) 的值是没有意义的。

由于生成函数的理解和应用大多来自习题,我就把笔记与习题放在一起了。

OGF 普通生成函数

定义为形式幂级数:

\[\sum\limits_{i=0}a_ix^i \]

也就是把某个序列用多项式进行刻画,通过 \(x\) 的不同幂次来区分每一项。

比如说,序列 \(a=\langle1,1,1,\dots\rangle\) 的生成函数为 \(F(x)=\sum\limits_{i=0}x^i\)

序列 \(a=\langle1,p,p^2,\dots\rangle\) 的生成函数为 \(F(x)=\sum\limits_{i=0}p^ix^i\)

换句话说,系数就是数列的通项公式。

基本运算

对于两个序列 \(a,b\) 的 OGF \(F(x),G(x)\),有:

\[F(x)\pm G(x)=\sum\limits_{i=0}(a_i\pm b_i)x^i \]

也就是 \(F(x)\pm G(x)\) 为序列 \(\langle a_n\pm b_n\rangle\) 的生成函数。

乘法运算,即卷积:

\[F(x)G(x)=\sum\limits_{i=0}x^i\sum\limits_{j=0}^{i}a_jb_{i-j} \]

因此 \(F(x)G(x)\) 为序列 \(\langle\sum\limits_{i=0}^{n}a_ib_{n-i}\rangle\) 的生成函数。

以上内容 cpy 自 oiwiki。

封闭形式

幂级数不好写,而因为 \(x\) 仅仅为代数对象,它的值没有意义,我们也就不用考虑生成函数的敛散性了。

运用封闭形式可以方便生成函数的化简。

比如说,\(a=\langle1,1,\dots\rangle\) 的生成函数为 \(F(x)=\sum\limits_{i=0}x^i\),我们有:

\[xF(x)=\sum\limits_{i=1}x^i \]

作差,有:

\[(1-x)F(x)=1 \]

即:

\[F(x)=\frac{1}{1-x} \]

这就是 \(F(x)\) 的封闭形式。

我们也可以类似地算出 \(a=\langle1,p,p^2\dots\rangle\) 的生成函数的封闭形式,为:\(F(x)=\dfrac{1}{1-px}\)

写一下 oiwiki 上的小练习:

  1. \(a=\langle0,1,1,\dots\rangle\)

幂级数:\(F(x)=\sum\limits_{i\ge 1}x^i\)

封闭形式:\(F(x)=\dfrac{x}{1-x}\)

  1. \(a=\langle1,0,1,0,1,\dots\rangle\)

幂级数:\(F(x)=\sum\limits_{i=0}\dfrac{(-1)^{i}+1}{2}x^i\)

封闭形式:\(F(x)=\dfrac{1}{1-x^2}\)

  1. \(a=\langle1,2,3,4,\dots\rangle\)

幂级数:\(F(x)=\sum\limits_{i=0}(i+1)x^i\)

封闭形式:\(F(x)=\dfrac{1}{(1-x)^2}\)

  1. \(a=\langle C_m^n \rangle\),其中 \(m\) 为常数

幂级数:\(F(x)=\sum\limits_{i=0}^m C_m^{i} x^i\)

封闭形式:\(F(x)=(x+1)^m\) (二项式定理)

  1. \(a=\langle C_{m+n}^{n} \rangle\),其中 \(m\) 为常数

幂级数:\(F(x)=\sum\limits_{i=0}C_{m+i}^{i}x^i\)

封闭形式:\(F(x)=\dfrac{1}{(1-x)^{m+1}}\)

我们有:\((1-x)F(x)=\sum\limits_{i=0}C_{m-1+i}^ix^i\)(手玩一下)

于是:\((1-x)^2F(x)=\sum\limits_{i=0}C_{m-2+i}^{i}x^i\)

\((1-x)^mF(x)=\sum\limits_{i=0}C_{m-m+i}^{i}x^i=\sum\limits_{i=0}x^i=\dfrac{1}{1-x}\)

于是 \(F(x)=\dfrac{1}{(1-x)^m}\)

我们约定 \(a \xrightarrow{\bf OGF} F(x)\) 表达序列 \(a\)(或者展开形式 \(a\))的 OGF 的封闭形式为 \(F(x)\)

常见的封闭形式:

\[\begin{aligned}&\langle1,1,1,\dots\rangle \xrightarrow{\bf OGF} \frac{1}{1-x}\\&\langle1,a,a^2,a^3\dots\rangle \xrightarrow{\bf OGF} \frac{1}{1-ax}\\&\sum\limits_{x=0}x^{ik} \xrightarrow{\bf OGF} \frac{1}{1-x^k}\\&\sum\limits_{x=0}c^ix^{ik} \xrightarrow{\bf OGF} \frac{1}{1-cx^k}\\&\left\langle\dbinom{n}{0},\dbinom{n}{1},\dbinom{n}{2},\dbinom{n}{3},\dots,\dbinom{n}{n} \right\rangle\xrightarrow{\bf OGF}(1+x)^n\\&\left\langle\dbinom{n}{0},-\dbinom{n}{1},\dbinom{n}{2},-\dbinom{n}{3},\dots,(-1)^n\dbinom{n}{n} \right\rangle\xrightarrow{\bf OGF}(1-x)^n\\&\left\langle\dbinom{n}{0},\dbinom{n+1}{1},\dbinom{n+2}{2},\dots \right\rangle\xrightarrow{\bf OGF}\frac{1}{(1-x)^{n+1}}\\&\left\langle0,1,\frac{1}{2},\frac{1}{3}\dots\right\rangle \xrightarrow{\bf OGF}\ln \frac{1}{1-x}=-\ln(1-x)\\&\left\langle0,1,\frac{1}{2!},\frac{1}{3!}\dots\right\rangle \xrightarrow{\bf OGF} e^x\end{aligned} \]

斐波那契数列的生成函数

我们令 \(a_0=0,a_1=1,a_n=a_{n-1}+a_{n-2}\),于是有:

\[\begin{aligned} &F(x)=a_0x^0+&a_1x^1+&a_2x^2+\dots \\x&F(x)= &a_0x^1+&a_1x^2+\dots \\x^2&F(x)= &&a_0x^2+\dots \end{aligned}\]

故:

\[(1-x-x^2)F(x)=a_0x^0+(a_1-a_0)x=x \]

于是有:\(F(x)=\dfrac{x}{1-x-x^2}\)

一般来说,封闭形式有两种作用:求递推式或通项。

我们尝试通过斐波那契数列的封闭形式求得其通项。

观察发现分母是二次的,于是我们据此,设一个待定系数方程:

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

通分,有:

\[\frac{A-Abx+B-Bax}{1-(a+b)x+abx^2}=\frac{x}{1-x-x^2} \]

于是有:

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

通过这个可以解出 \(a,b,A,B\)

\[\begin{cases} A=\dfrac{1}{\sqrt 5} \\B=-\dfrac{1}{\sqrt 5} \\a=\dfrac{1+\sqrt 5}{2} \\b=\dfrac{1-\sqrt 5}{2} \end{cases}\]

我们解出来 \(a,b,A,B\) 有什么用呢?注意到我们有:

\[F(x)=\frac{A}{1-ax} + \frac{B}{1-bx} \]

\(G(x)=\dfrac{A}{1-ax}\),则有 \((1-ax)G(x)=A\)

于是我们就能容易地得到 \(G(x)\) 的展开形式: \(G(x)=\sum\limits_{i=0}Aa^ix^i\)

这样我们 \(F(x)\) 的展开形式就有了:

\[F(x)=\sum\limits_{i=0}(Aa^i+Bb^i)x^i \]

\(a,b,A,B\) 带入,有:

\[F(x)=\sum\limits_{i=0}x^i\frac{1}{\sqrt 5}\left( \big(\frac{1+\sqrt 5}{2}\big)^i- \big(\frac{1-\sqrt 5}{2}\big)^i\right) \]

这样我们就求出其通项了!!!

牛顿二项式定理

又称扩展二项式定理。

这个东西可以方便我们通过封闭形式求展开形式。

我们重定义组合数:

\[\dbinom{r}{k}=\frac{r^{\underline{k}}}{k!} \]

其中 \(r\in\mathbb{C},k\in\mathbb{N}\)

于是对于 \(\alpha\in \mathbb{C}\),我们有:

\[(1+x)^\alpha=\sum\limits_{n\ge0} \dbinom{\alpha}{n}x^n \]

应用

两个 OGF 相乘是其卷积,组合意义是顺序拼接

举个例子:

1. 付钱问题

我们有面额为 \(2,3,5\) 的硬币,每种都能无限使用,求用这些硬币付 \(n\) 元钱的方案。

我们设数列 \(a\)\(a_n\) 表示用面额为 \(2\) 的硬币拼成 \(n\) 元的方案数。

显然有 \(a=\langle1,0,1,0,1,0\dots\rangle\)

类似地,我们定义出 \(b,c\)\(3,5\) 元的方案数。

如果 \(a\) 的 OGF 为 \(F_a(x)\)\(b\) 的 OGF 为 \(F_b(x)\),考虑 \(F_a(x)F_b(x)\)\(n\) 次项系数:

\[\sum\limits_{i=0}^na_ib_{n-i} \]

表达的含义就是 \(i\) 元钱用 \(2\) 来拼,\(n-i\) 元钱用 \(3\) 来拼,方案数相乘。

很显然这个系数就是用 \(2,3\) 拼成 \(n\) 的方案数。

这样我们就能够理解:\(F_a(x)F_b(x)F_c(x)\)\(n\) 次项系数就是问题索求。

2.P6078 [CEOI2004] Sweets

本题利用牛顿二项式定理推式子。

\(n\) 堆糖果,第 \(i\) 堆里面有 \(m_i\) 个。一共要吃 \(a\le x\le b\) 个糖,求方案数。

对于第 \(i\) 堆,我们考虑序列 \(p_i=\langle1,1,\dots,1\rangle\)\(p_{i,j}\) 表示在第 \(i\) 堆糖果里吃 \(j\) 个的方案数,显然为 \(1\)

我们有 \(p_i\) 的生成函数:\(F_i(x)=\sum\limits_{j=0}^{m_i}x^j=\dfrac{1-x^{m_i+1}}{1-x}\)

因此第 \(k\) 项系数表示从所有的糖中吃 \(k\) 个的方案数的生成函数 \(G(x)\) 为:

\[G(x)=\prod\limits_{i=1}^{n}F_i(x)=(1-x)^{-n}\prod\limits_{i=1}^{n}(1-x^{m_i+1}) \]

于是原问题就变成了求 \(\sum\limits_{i=a}^{b}[x^i]G(x)\),或者说 \(G(x)\)\(a\) 次项系数到 \(b\) 次项系数的和。

由于 \(n\le 10\),我们对 \(\prod\limits_{i=1}^{n}(1-x^{m_i+1})\) 直接暴力展开,会有至多 \(2^n\) 项。

我们对 \((1-x)^{-n}\) 使用牛顿二项式定理:

\[(1-x)^{-n}=\sum\limits_{i\ge0}\dbinom{-n}{i}(-x)^i \]

把这个广义组合数拆开,有:

\[\sum\limits_{i\ge0}\frac{(-n)(-n-1)\dots(-n-i+1)}{i!}(-x)^i \]

\(i\) 为偶数时,\((-x)^i=x^i\),我们对这个分数的分子每一项都取相反数,为:

\[\sum\limits_{i\ge0}\frac{(n)(n+1)\dots(n+i-1)}{i!}x^i \]

不难发现这个就是:

\[\sum\limits_{i\ge0}\dbinom{n+i-1}{i}x^i \]

\(i\) 为奇数时,\((-x)^i=-x^i\),还是对分子每一项取相反数,但多一个负号:

\[\sum\limits_{i\ge0}\frac{-(n)(n+1)\dots(n+i-1)}{i!}\cdot(-x^i) \]

两个负号抵消,又变回了:

\[\sum\limits_{i\ge0}\dbinom{n+i-1}{i}x^i \]

于是我们有:

\[(1-x)^{-n}=\sum\limits_{i\ge0}\dbinom{n+i-1}{i}x^i \]

考虑 \(\prod\limits_{i=1}^{n}(1-x^{m_i+1})\) 的某一项 \(x^k\) 对答案的贡献,设 \(\prod\limits_{i=1}^{n}(1-x^{m_i+1})\)\(x^k\) 的系数为 \(c^k\),于是贡献为:

\[c_k\sum\limits_{i=a-k}^{b-k}\dbinom{n-1+i}{i}=c_k\left(\dbinom{n+b-k}{b-k} - \dbinom{n+a-k-1}{a-k-1}\right) \]

然后 \(O(b)\) 求答案。

复杂度为 \(O(2^n\cdot b)\)

关于上式的证明,其实就是在证:

\[\sum\limits_{i=l}^{r}\dbinom{n-1+i}{i}=\dbinom{n+r}{r}-\dbinom{n+l-1}{l-1} \]

即证:

\[\sum\limits_{i=0}^{m}\dbinom{n+i}{i}=\dbinom{n+m+1}{m} \]

画个杨辉三角,癔症。

当然因为这个逆天模数不是质数,我们要想想怎么求组合数。

注意到我们求的组合数都是 \(\dbinom{n+p}{p}\) 形式的,它等于:

\[\frac{(n+p)!}{n!\cdot p!}=\frac{(p+1)\times\dots\times(n+p)}{n!} \]

我们发现 \(n!\) 很小,于是我们可以对分子取模 \(2004\times n!\),然后再除以 \(n!\) 后再模 \(2004\) 即可。

这样这个题就做完了。

提交记录

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

本题运用类似斐波那契数列通项公式的推法来推通项。

简述题意:给定 \(n\),求对于每一种 \(n\) 的拆分(记为 \(a_1\dots a_m\),其中 \(1\le m,a_i\le n\)),求和 \(\prod\limits_{i=1}^{m}Fib_{a_i}\)

其中 \(Fib_i\) 为斐波那契数列第 \(i\) 项;\(Fib_0=0,Fib_1=1\)

由于对生成函数不熟悉,我们慢慢推一下东西。

先考虑只把 \(n\) 拆成两个数,我们如何对于每一种拆分方案,计算贡献之和。

我们记斐波那契数列 \(\langle0,1,1,2,3,5,\dots\rangle\) 的生成函数为 \(F(x)\)

仔细一想,会发现 \([x^n]F(x)^2\) 就是我们要求的贡献之和。根据卷积,它就是:\(\sum\limits_{i=0}^{n}Fib_i\cdot Fib_{n-i}\)。这里 \(i\) 枚举了拆分方案,卷积求了和。

进而,我们如果把 \(n\) 拆成 \(m\) 个数,贡献之和就是 \([x^n]F(x)^m\)

由于题目没说分成几个数,于是我们要枚举 \(m\),于是答案为:

\[\sum\limits_{i=1}^{n}[x^n]F(x)^i \]

由于不同项系数互不影响,我们就可以写作:

\[[x^n]\sum\limits_{i=1}^{n}F(x)^i \]

我们考虑把后面的东西写成一个关于 \(F(x)\) 的生成函数形式。

首先,这里的上界显然可以换成 \(\infty\),因为次数大于 \(n\) 时不会对 \(x^n\) 项系数产生影响。

于是我们令 \(G(x)=\sum\limits_{i\ge 1}F(x)^i\)

因为我们知道 \(\sum\limits_{i\ge 1}x^i=\dfrac{x}{1-x}\)(oiwiki 小练习1)

所以我们有:

\[G(x)=\frac{F(x)}{1-F(x)} \]

\(F(x)=\dfrac{x}{1-x-x^2}\) 带入,化简得:

\[G(x)=\frac{x}{1-2x-x^2} \]

类似斐波那契数列,我们设:

\[\frac{A}{1-ax}\cdot\frac{B}{1-bx}=\frac{x}{1-2x-x^2} \]

通分,有:

\[\frac{A-Abx+B-Bax}{1-(a+b)x+abx^2}=\frac{x}{1-2x-x^2} \]

于是有:

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

通过这个可以解出 \(a,b,A,B\)

\[\begin{cases} A=\dfrac{\sqrt 2}{4} \\B=-\dfrac{\sqrt 2}{4} \\a=1+\sqrt 2 \\b=1-\sqrt 2 \end{cases}\]

我们有:

\[G(x)=\sum\limits_{i=0}(Aa^i+Bb^i)x^i \]

\(a,b,A,B\) 带入,有:

\[G(x)=\sum\limits_{i=0}x^i\frac{\sqrt 2}{4}\left( (1+\sqrt 2)^i- (1-\sqrt 2)^i\right) \]

由于我们要求的答案为 \([x^n]G(x)\),也就是:

\[[x^n]G(x)=\frac{\sqrt 2}{4}\left((1+\sqrt 2)^n-(1-\sqrt 2)^n\right) \]

奇波拉求一下 \(\sqrt 2\),带入并快速幂就行了。

提交记录

4. UVA12298 Super Poker II

这题的解法在多项式习题中详细解释了。

为什么放在这里?四个数列 \(p_1\sim p_4\) 的卷积其实就是在跑一个背包。相应的,从生成函数之积理解,就代表了一种拼接的过程,对应了 OGF 的组合意义。(?)

这题也为我们提供了一种把题目向多项式和生成函数转化的思路。

4.5.CF632E Thief in a Shop(和一点心得)

这些是心得:

假如说我们有一个长度为 \(n\) 的数组 \(c\)

我们有这么一种构造方式,类似于背包:

构造序列 \(a\),使得 \(a_{c_i}=1\),其他位置为 \(0\)\(i\in[1,n]\)

如果我们求出 \(a\) 的生成函数 \(F(x)=\sum x^{c_i}\),则 \([x^t]F(x)^k\) 表达的含义为:\(k\) 个数,拼成 \(t\),且顺序不同的方案数

也就是说,我们每次多乘一个 \(F(x)\),就像是发生了一次 dp 转移,使得我们可以多使用一个数。

有一道练习题,标题上就说了。

只需要用和心得相同的方式构造 \(F(x)\),求 \(F(x)^k\) 不为 \(0\) 的项输出项的编号即可。

这个题有专门对 \(998244353\)\(1004535809\)的 hack 数据,所以我选择了原根为 \(31\) 的模数 \(2013265921\),这个没人卡!

提交记录

4.75.BZOJ3771. Triple

你应该把这个题放在 CF632E Thief in a Shop 后面。——Qcfff

给定 \(n\) 个不同的 \(a_i\),求选 \(1\)\(2\)\(3\) 个能组成多少种权值,以及每种权值有多少种方案。

首先 OGF,构造:

\[F(x)=\sum\limits x^{a_i} \]

然后我们求出 \(G(x)=F(x)^2\)\(H(x)=F(x)^3\)

但我们不能简单的把 \(F\)\(G\)\(H\) 对应项系数相加,因为这样既会算重复的,又会算不同排列。怎么办呢?

构造:

\[A(x)=\sum x^{2a_i},B(x)=A(x)F(x),C(x)=\sum x^{3a_i} \]

拿样例举例:五种权值为 \(5,6,7,8,9\),考虑 \(16\) 的构造。

容易发现,\(\dfrac{G(x)-A(x)}{2}\) 就是两把斧子。减掉 \(A(x)\) 表示把 \(16=8+8\) 构成的情况去掉,除以 \(2\) 表示废掉 \((7,9)\)\((9,7)\) 之一,只保留一个。

然后 \(\dfrac{H(x) - 3\times \Big(B(x)-C(x)\Big) -C(x)}{6}\) 是三把斧子。

\[18=6+6+6=5+5+8=5+6+7 \]

\(B(x)\) 会统计以下结果:\(([5,5],8),([6,6],6)\)

\(C(x)\) 会统计以下结果:\((6,6,6)\)

\(B(x)-C(x)\) 相当于排除掉 \((6,6,6)\) 这种组合,再乘以 \(3\) 表达 \((5,5,8),(5,8,5),(8,5,5)\) 均在 \(H(x)\) 中统计,所以都要去掉。

减去 \(C(x)\) 表达把 \((6,6,6)\) 减去。最后除以 \(6\) 表达废掉 \((5,6,7),(5,7,6),(6,5,7),(6,7,5),(7,5,6),(7,6,5)\) 之五,只保留一个。

最后记得:

宝玉亦暇,好事多“模”

提交记录

4.875.BZOJ3513. idiots

\(n\) 个木棒,随机选出三根,求能围成三角形的概率。

全程没有一点自己的思考,对着 Qcf 照搬。

由于木棒有重复,我们考虑 \(t_i\) 表示长度为 \(i\) 的木棒的出现次数。

构造生成函数 \(F(x)=\sum x^{t_i}\)

运用和上一道例题相似的办法,令 \(A(x)=\sum x^{2t_i}\),则 \(\dfrac{F(x)^2-A(x)}{2}\) 就是用两根不相同的木棒拼成 \(i\) 的方案数。

然后尝试统计,发现正着很难,于是正难则反,考虑统计围不成三角形的概率。

围不成三角形等同于两边之和小于等于第三边,于是我们枚举第三遍,只需要使两边之和小于等于它就行了。也就是:

\[\sum\limits_{i=0}^{\max(a)}t_i\sum\limits_{j=1}^{i}[x^j]\dfrac{F(x)^2-A(x)}{2} \]

后者显然前缀和,这个就能 \(O(n)\) 算了。

记得除以 \(\dbinom{n}{3}\) 后再用 \(1\) 去减,算出能围成的概率。

提交记录

4.9375.P3321 [SDOI2015] 序列统计

这个序号没完了是吧。

给了素数 \(m\),和一个互不相同的,元素均小于 \(m\) 的集合 \(S\),考虑构造一个长度为 \(n\) 的序列,满足:

  • 序列的元素均属于 \(S\)
  • 序列的每一项之积为 \(X\)

其中 \(X\) 给定,求这样的序列个数。

我们记集合大小为 \(|S|\)

那么我们可以列出一个式子:

\[S_1^{a_1}\cdot S_2^{a_2}\cdots S_{|S|}^{a_{|S|}}\equiv X\pmod m \]

我们要构造出一组 \(a\),保证 \(\sum a=n\),且上述式子成立。

然后看了题解,发现这个题和离散对数有关!!!

所以我们找到模 \(m\) 的原根 \(g\)。根据原根的知识,若 \(\gcd(a,m)=1\),则 \(g^x\equiv a\pmod m\) 一定有解。

于是我们可以设 \(S_i\equiv g^{k_i}\pmod m\)\(X\equiv g^{K}\pmod m\)

则原式变为:

\[g^{\sum\limits_{i=1}^{|S|}a_ik_i}\equiv g^{K}\pmod m \]

于是有:

\[\sum\limits_{i=1}^{|S|}a_ik_i\equiv K\pmod {\varphi(m)} \]

这个东西相当于在说:从 \(|S|\) 个物品中选出 \(n\) 个,可以重复选,求出它们的和在模 \(m\) 的意义下与 \(K\) 同余。

然后就变成了生成函数的题!

我们构造 OGF:\(F(x)=\sum x^{k_i}\)

求出 \(F(x)^n\) 的第 \(K\) 项,第 \(K+\varphi(m)\) 项,第 \(K+2\varphi(m)\) 项……系数之和就行了。

首先,我们快速幂不能 \(\ln\exp\),因为常数项不为 \(1\),不方便,而这个题时限允许我们用倍增快速幂。

我们在每次多项式乘法后,进行如下操作:

对所有的 \(i\ge \varphi(m)\),执行 \(f_{i\bmod \varphi(m)} \leftarrow f_{i\bmod \varphi(m)}+f_i\),然后 \(f_i\leftarrow 0\)

容易证明这对快速幂不影响。这样子操作后,我们只需要输出答案的 \(K\bmod \varphi(m)\) 项系数就行了。

提交记录

这大缝合怪只评紫?

5.CF438EThe Child and Binary Tree

毕竟是学习中,看题解不可耻(心虚)

这题是个 dp。没想出来咋 dp。

我们设 \(f_x\) 表示权值为 \(x\) 的二叉树个数。

\(g_x=[x\in c]\),即如果 \(x\)\(c\) 数组中的某一个,那么 \(g_x=1\),否则 \(g_x=0\)

我们可以写出 \(f\) 的转移:

\[f_n=\begin{cases} 1 & n=0\text{ or }n=1 \\ \sum\limits_{i=0}^{n}g_i\sum\limits_{j=0}^{n-i}f_{j}f_{n-i-j} &\text{otherwise} \end{cases}\]

表达的含义为:枚举根为 \(i\),左子树权值为 \(j\),右子树权值为 \(n-i-j\) 的情况。

如果我们记 \(f\) 的生成函数为 \(F(x)\)\(g\) 的生成函数为 \(G(x)\),那么下面式子表达的就是:

\[\begin{aligned} F(x)&=\sum\limits_{n=0}f_nx^n \\&=f_0x^0+\sum\limits_{n\ge1}x^n\sum\limits_{i=0}^{n}g_i\sum\limits_{j=0}^{n-i}f_{j}f_{n-i-j} \end{aligned}\]

为了化为卷积形式,我们刻意让后面对 \(n\) 的枚举从 \(0\) 开始!这样做不会影响结果,于是(\(f_0x^0=1\)):

\[F(x)=1+\sum\limits_{n=0}x^n\sum\limits_{i=0}^{n}g_i\sum\limits_{j=0}^{n-i}f_{j}f_{n-i-j} \]

此时就会发现后面的式子就是 \(G(x)F(x)^2\),于是得出:

\[F(x)=1+G(x)F(x)^2 \]

解一元二次方程,有:

\[F(x)=\frac{1\pm \sqrt{1-4G(x)}}{2G(x)} \]

有两个解,咋办捏?(下面内容引自九阳哥博客)

\(x=0\) 带入(我不太理解对于一个值没有意义的生成函数,把一个值带进去有何意义?),应有 \(F(0)=f_0=1\)\(G(x)=0\)

于是会有方程 \(1=\dfrac{1\pm 1}{0}\)。当取正号时,右边趋于正无穷,矛盾;所以只能取负号,这里分子分母都有 \(0\),约了(???好逆天)

所以我们就有:

\[F(x)=\frac{1-\sqrt{1-4G(x)}}{2G(x)}=\frac{}{}\frac{2}{1+\sqrt{1-4G(x)}} \]

套个多项式板子整整就行了。啊?

提交记录

6.P4389 付公主的背包

还是抄题解。

根据例题一付钱问题,我们很容易把背包转化成如下形式:

\(n\) 个数列,其生成函数为 \(F_j(x)=\sum\limits_{i=0}x^{iv_j}\)

\(G(x)=\prod\limits_{i=1}^{n}F_i(x)\)

输出 \(G(x)\)\(1\sim m\) 项即可。

暴力背包转移寄掉。易得 \(F_i(x)\) 的封闭形式:

\[F_i(x)=\frac{1}{1-x^{v_i}} \]

于是我们有:

\[G(x)=\frac{1}{\prod\limits_{i=1}^{n}(1-x^{v_i})} \]

复杂度 \(O(2^n)\) 更慢了!

于是来了很牛逼的一步:我们把乘积转化成指数相加。具体的,我们设 \(A_i(x)=1-x^{v_i}\)\(B(x)=\prod\limits_{i=1}^{n}A_i(x)\)

于是会有:

\[B(x)=\prod\limits_{i=1}^{n}\mathrm{e}^{\ln A_i(x)}=\mathrm{e}^{\sum\limits_{i=1}^{n}\ln A_i(x)} \]

我们思考 \(\ln A_i(x)\) 怎么求。

我们设 \(\ln A_i(x)=H(x)\)

两边对 \(x\) 求导,有(左式可参见多项式 \(\ln\) 的推导过程):

\[\frac{A_i'(x)}{A_i(x)}=H'(x) \]

因为 \(A_i(x)=1-x^{v_i}\),于是 \(A_i'(x)=-v_ix^{v_i-1}\),故:

\[\frac{-v_ix^{v_i-1}}{1-x^{v_i}}=H'(x) \]

\(-v_ix^{v_i-1}\) 提出来,后面的东西可以从封闭形式转化成展开形式:

\[-v_ix^{v_i-1}\sum\limits_{j=0}x^{jv_i}=H'(x) \]

再把外面的项乘进去:

\[-\sum\limits_{j=0}v_ix^{jv_i+v_i-1}=H'(x) \]

两边同时积分,由于 \(ax^{b}\) 积分的结果为 \(\dfrac{a}{b+1}x^{b+1}\),于是有(积分对加法有没有分配律我也不到):

\[-\sum\limits_{j=0}\frac{v_i}{jv_i+v_i}x^{jv_i+v_i}=H(x)=\ln A_i(x) \]

左边太丑了,化简它!显然可以约分:

\[-\sum\limits_{j=0}\frac{1}{j+1}x^{v_i(j+1)}=\ln A_i(x) \]

发现都是 \(j+1\),于是我们 \(j\)\(1\) 开始枚举:

\[-\sum\limits_{j=1}\frac{1}{j}x^{jv_i}=\ln A_i(x) \]

我们要求的就是:

\[\sum\limits_{i=1}^{n}\ln A_i(x)=-\sum\limits_{i=1}^{n}\sum\limits_{j=1}\frac{1}{j}x^{jv_i} \]

要找到这个多项式在 \(1\sim m\) 次项系数。

如果 \(v_i\) 相同,提供的贡献也是相同的,于是可以把 \(v_i\) 的出现次数存起来。

直接枚举互不相同的 \(v_i\),然后 \(j\le \dfrac{m}{v_i}\) 时才会有贡献。复杂度是调和级数了,为 \(O(m\log m)\)

求出这个,\(\exp\) 一下,求一下逆就行了。

提交记录

EGF 指数生成函数

定义为形式幂级数:

\[\hat F(x)=\sum\limits_{i=0}a_i\frac{x^i}{i!} \]

可以理解为序列 \(\langle\dfrac{a_i}{i!}\rangle\) 的 OGF。

封闭形式

对于序列 \(a=\langle1,1,1,\dots\rangle\),我们有其封闭形式:

\[\hat F(x)=\mathrm{e}^x \]

\(\mathrm{e}^x\) 泰勒展开就行。

我们列出几个常见的 EGF 封闭形式:

\[\begin{aligned} &\langle1,1,1,\dots\rangle \xrightarrow{\bf EGF} \mathrm{e}^x \\&\langle1,p,p^2,\dots\rangle \xrightarrow{\bf EGF} \mathrm{e}^{px} \\&\langle1,-1,1,-1,\dots\rangle \xrightarrow{\bf EGF} \mathrm{e}^{-x} \\&\langle1,0,1,0,\dots\rangle \xrightarrow{\bf EGF} \frac{\mathrm{e}^x+\mathrm{e}^{-x}}{2} \\&\langle0,1,0,1,\dots\rangle \xrightarrow{\bf EGF} \frac{\mathrm{e}^x-\mathrm{e}^{-x}}{2} \end{aligned}\]

基本运算

  • 加减和 OGF 相同,我们考虑卷积。

对于两个序列 \(a,b\),设它们的 EGF 分别为 \(\hat F(x),\hat G(x)\),则:

\[\begin{aligned} \hat F(x) \hat G(x)&=\sum\limits_{n=0}x^n\sum\limits_{i=0}^{n}\frac{a_ib_{n-i}}{i!(n-i)!} \\&=\sum\limits_{n=0}\frac{x^n}{n!}\sum\limits_{i=0}^{n}\dbinom{n}{i}a_ib_{n-i} \end{aligned}\]

也就是说 \(\hat F(x)\hat G(x)\) 是序列 \(\left\langle\sum\limits_{i=0}^{n}\dbinom{n}{i}a_ib_{n-i}\right\rangle\) 的 EGF。

注意第 \(n\) 项系数 \(\sum\limits_{i=0}^{n}\dbinom{n}{i}a_ib_{n-i}\),代表的是把 \(n\) 个有标号的元素,选 \(i\) 个分配给 \(a\),剩余的 \(n-i\) 个分配给 \(b\)

这意味着 EGF 的积的组合意义是有标号的拼接(我也看不懂……)。

还有一种理解:把两个部分“归并”,不同的方案数也是上式。比如:

OGF:{AAAA}×{BBB}={AAAABBB},无标号的直接拼接。

EGF:{AAAA}×{BBB}={ABBAABA},{BAABAAB},{BBABAAA}...\(\dbinom{7}{3}\) 种方案。

  • 还有一个重要性质:对于 EGF \(\hat F(x)\),考虑 \(\mathrm{e}^{\hat F(x)}\) 的含义。

根据 \(\mathrm{e}^x\)麦克劳林级数定义(或者理解为 \(\langle1,1,1,\dots\rangle\) 的封闭形式),有:

\[\mathrm{e}^{\hat F(x)}=\sum\limits_{i=0}\frac{\hat F(x)^i}{i!} \]

\(\hat F(x)^i\) 表示把 \(i\) 个集合拼在一起,除以 \(i!\) 相当于把集合间的先后顺序废掉,所以如果 \(\hat F(x)\) 为单个部分的 EGF,那么 \(e^{\hat F(x)}\) 就是若干个相同部分组成的整体的 EGF。

这几段话我是一点都看不懂。不做题根本不理解这是在说什么。淦。

例题

看些例题吧。

记得一般我们把 EGF 当做 OGF 算,所以最后要乘个阶乘!

1.「染色问题」

用红绿蓝三种颜色染一个长为 \(n\) 的纸条,要求红色和绿色分别的出现次数只能偶数次。

我们不妨先看一下只用一种颜色染满纸条会是什么样。

于是我们对三个颜色分别构造数列 \(r,g,b\)。某个数列的第 \(k\) 项表示只用这一种颜色染满纸条的方案数。

显然有 \(r=g=\langle1,0,1,0,\dots\rangle\)\(b=\langle1,1,1,1,\dots\rangle\)

令这三个序列的 EGF 分别为:\(\hat F_r(x),\hat F_g(x),\hat F_b(x)\)

显然有 \(\hat F_r(x)=\hat F_g(x)=\dfrac{e^x+e^{-x}}{2}\)\(\hat F_b(x)=e^x\)

我们考虑某两个 EGF 的乘积。比如说 \(\hat F_r\)\(\hat F_g\)

这相当于把纯红色的纸带和纯绿色的纸带,“归并”成一个红绿相间的纸带。

因为 \([x^n](\hat F_r(x)\hat F_g(x))=\sum\limits_{i=0}^{n}\dbinom{n}{i}r_ig_{n-i}\),多乘一个组合数就刚好枚举了红绿交替的情况。

这样子我们就能理解 \(\hat F_r(x)\hat F_g(x)\) 的实际含义了!它的第 \(n\) 项系数表达的,正是一条红绿相间的纸带有多少种方案!

于是我们再乘上 \(\hat F_b(x)\),就有了红绿蓝相见的纸带方案数了!

\[\hat F_r(x)\hat F_g(x)\hat F_b(x)=\left(\frac{e^x+e^{-x}}{2}\right)^2e^x=\frac{e^{3x}+2e^x+e^{-x}}{4} \]

提取第 \(n\) 项系数就行:

\[\frac{3^n+2\cdot 1^n+(-1)^n}{4} \]

2. P5339 [TJOI2019] 唱、跳、rap和篮球

抄题解。

\(f(k)\) 表示钦定 \(k\) 组,剩余的随意排列的方案数。

\(g(k)\) 表示一共有 \(k\) 组的方案数。

于是有 \(f(k)=\sum\limits_{i=k}\dbinom{i}{k}g(k)\),意义为枚举一共有 \(i\ge k\) 组,我们钦定\(i\) 组中的 \(k\) 个,共有 \(\dbinom{i}{k}\)钦定方式

有一个二项式反演,我不会,但能得出以下结论:

\[g(k)=\sum\limits_{i=k}(-1)^{i-k}\dbinom{i}{k}f(i) \]

我们要求的是 \(g(0)\),也就是没有唱跳 rap 篮球组合的方案。

\(k=0\) 带入上式,有:

\[g(0)=\sum\limits_{i=0}(-1)^if(i) \]

因为当 \(k=0\) 时,\(\dbinom{i}{k}=1\)

我们考虑 \(f(k)\) 怎么求。

\(S(a,b,c,d,n)\) 表示最多 \(a\) 个唱,\(b\) 个跳,\(c\) 个 rap,\(d\) 个篮球,队里头最多放 \(n\) 个人,任意排列的方案数。

对于 \(f(k)\),我们把原本的 \(k\) 组分别缩成一个整体,这样子队伍中只剩下 \(n-3k\) 个人。我们选出 \(k\) 个位置来放这 \(k\) 个整体,选法为 \(\dbinom{n-3k}{k}\)

选好了 \(k\) 组人的位置,剩余的位置可以随便填。剩下的位置共有 \(n-4k\) 个,四种人各自少了 \(k\) 个,于是方案数为 \(S(a-k,b-k,c-k,d-k,n-4k)\)

所以我们有:

\[f(k)=\binom{n-3k}{k}S(a-k,b-k,c-k,d-k,n-4k) \]

带入 \(g(0)\) 的式子,有:

\[g(0)=\sum\limits_{k=0}(-1)^k\binom{n-3k}{k}S(a-k,b-k,c-k,d-k,n-4k) \]

显然 \(k\le \dfrac{n}{3}\),由于 \(n\le 10^3\),于是我们先枚举 \(k\),考虑 \(S(a-k,b-k,c-k,d-k,n-4k)\) 怎么求。

\(S(a,b,c,d,n)\) 的组合意义是:用四种有个数限制的颜色,涂满一个长度为 \(n\) 的纸带。这正好是例题1染色问题!

转化成 EGF 就能 \(O(n\log n)\)\(S\) 了。这样总复杂度是 \(O(n^2\log n)\)。比较慢,能优化。

把 EGF 式子写开看看,我们把四种人的生成函数分别记作 \(\hat F_{1\sim 4}(x)\)

于是乎我们有:

\[\hat F_1(x)=\sum\limits_{i=1}^{a-k}\frac{x^i}{i!} \]

\[\vdots \]

\[\hat F_4(x)=\sum\limits_{i=1}^{d-k}\frac{x^i}{i!} \]

这样我们要求的答案就是 \([x^{n-4k}]\hat F_1(x)\hat F_2(x)\hat F_3(x)\hat F_4(x)\)

我们考虑先求出 \(\hat F_1(x)\hat F_2(x)\)\(\hat F_3(x)\hat F_4(x)\)\(x^0\sim x^{n-4k}\) 项,然后可以直接算答案。

我们从大到小枚举 \(k\),这样的话我们四个生成函数的上界每次只会增加 \(1\),可以优化计算。、

\(k\) 的最大值为 \(k_0=\min(a,b,c,d,\dfrac{n}{4})\)

我们先处理出 \(k=k_0\)\(\hat F_1(x)\hat F_2(x)\)\(\hat F_3(x)\hat F_4(x)\) 的结果,然后考虑上界增加 \(1\) (以 \(k_0\rightarrow k_0-1\) 来举例)时这两个会怎么变化。记上界变化后的生成函数为 \(\hat F'_i(x)\),以 \(\hat F'_1(x)\hat F'_2(x)\) 来举例:

\[\begin{aligned} \hat F'_1(x)\hat F'_2(x)&=\Big(\hat F_1(x)+\frac{x^{a-k_0+1}}{(a-k_0+1)!}\Big)\Big(\hat F_2(x)+\frac{x^{b-k_0+1}}{(b-k_0+1)!}\Big) \\&=\hat F_1(x)\hat F_2(x)+\frac{x^{a-k_0+1}}{(a-k_0+1)!} \hat F_2(x)+\frac{x^{b-k_0+1}}{(b-k_0+1)!}\hat F_1(x)+\frac{x^{(a-k_0+1)+(b-k_0+1)}}{(a-k_0+1)!(b-k_0+1)!} \end{aligned}\]

第一项算过了,第二三项可以 \(O(n)\) 算,最后一项 \(O(1)\) 算。

这样就行了。

提交记录

3. P5748 集合划分计数

求将 \(n\)不同的球放进若干个相同盒子的方案数。

这个题能够增进我对前文所述 \(\mathrm{e}^{\hat F(x)}\) 的理解。

假设只有一个盒子且必须放,我们构造数列 \(a=\langle0,1,1,1,\dots\rangle\),它的第 \(n\) 项表达将 \(n\) 个不同的球放进一个盒子里的方案数。

由于我们盒子必须放东西,所以 \(a_0=0\),后面会解释为什么要求必须放。

我们能求出 \(a\) 的 EGF:\(\hat F(x)=\sum\limits_{i\ge 1}\dfrac{x^i}{i!}=e^x-1\)

如果两个相同的盒子且每个盒子至少一个球呢?它的生成函数为 \(\dfrac{F(x)^2}{2!}\)

我们以第 \(n\) 项举例:\([x^n]\dfrac{F(x)^2}{2!}=\dfrac{1}{2}\sum\limits_{i=0}^{n}\dbinom{n}{i}a_ia_{n-i}\)

因为球不同,我们枚举向第一个盒子放 \(i\) 个球,向第二个盒子放 \(n-i\) 个球后,还需要乘上一个组合数 \(\dbinom{n}{i}\) 表示选取哪些有标号的球!

再由于两个 \(F(x)\) 之间谁先放谁后放的先后顺序要废掉,所以除掉一个 \(2!\)

或者说,\(F(x)^2\) 是两个不同的盒子的生成函数,除以 \(2!\) 后就变回了相同的盒子。

所以 \(\dfrac{F(x)^2}{2!}\) 就是两个相同的盒子且每个盒子至少一个球的生成函数!

我们要求的是若干个盒子,所以答案就是 \([x^n]\sum\limits_{i\ge 0}\dfrac{\hat F(x)^i}{i!}=\mathrm{e}^{\hat F(x)}=\mathrm{e}^{\mathrm{e}^x-1}\)

这里为什么 \(i\) 可以从 \(0\) 开始?\(\hat F(x)^0\) 根本没有意义啊?其实这时候 \(\dfrac{\hat F(x)^0}{0!}=1\) 会加在常数项中,而常数项我们从来没有用过,所以加上去也无妨我们索求的答案!

多项式 \(\exp\) 就行了。

提交记录

\[\begin{aligned}\\\\\\\\\\\\\\\\\\\\\\\end{aligned} \]

posted @ 2024-03-23 14:26  一匹大宝羊  阅读(74)  评论(0编辑  收藏  举报