OI-WIKI。

普通生成函数

F(x)=∑nanxnF(x)=\sum_{n}a_n x^n

aa 可以是有穷序列,也可以是无穷的。

基本运算

加法运算:

F(x)±G(x)=∑n(an±bn)xnF(x)\pm G(x)=\sum_n (a_n\pm b_n)x^n

乘法运算(卷积):

F(x)G(x)=∑nxn∑i=0naibn−iF(x)G(x)=\sum_n x^n \sum_{i=0}^na_ib_{n-i}

封闭形式

例如 ⟨1,1,1,⋯ ⟩\langle 1,1,1,\cdots\rangle 的普通生成函数 F(x)=∑n≥0xnF(x)=\sum_{n\ge 0}x^n:

F(x)x+1=F(x)F(x)=11−xF(x)x+1=F(x)\\ F(x)=\frac{1}{1-x}

HDU - 2152 Fruit

HDU - 2152 Fruit。

每个水果选 aia_i 到 bib_i 个之间,一共选 mm 个,问方案数。

直接生成函数就做完了:

(xa1+xa1+1+⋯+xb1)(xa2+xa2+1+⋯+xb2)⋯(xan+xan+1+⋯+xbn)(x^{a_1}+x^{a_1+1}+\cdots+x^{b_1})(x^{a_2}+x^{a_2+1}+\cdots+x^{b_2})\cdots(x^{a_n}+x^{a_n+1}+\cdots+x^{b_n})

P6300 悔改

P6300 悔改。

这道题标签没有生成函数,但是这个就是生成函数的题,算模板吧。

这种题先设 cic_i 表示 ii 的出现次数。

ansk=12∑i+j=kmin⁡(ci,cj)=12∑d=1n∑i+j=k[ci≥d][cj≥d]\begin{aligned} ans_k &= \frac{1}{2} \sum_{i+j=k}\min(c_i,c_j)\\ &=\frac{1}{2} \sum_{d=1}^n\sum_{i+j=k}[c_i\ge d][c_j\ge d]\\ \end{aligned}

我们发现这个很像生成函数的卷积形式,于是我们设生成函数 fd(x)f_d(x):

fd(x)=∑i[ci≥d]xif_d(x)=\sum_i [c_i\ge d]x^i

然后将 fd(x)f_d(x) 代入:

ansk=12∑d=1nfd(x)2(k)ans_k=\frac{1}{2}\sum_{d=1}^nf_d(x)^2(k)

到现在我们已经推完了生成函数,但是这个还是会 TLE。我们还需要一点注意力,可以发现,dd 离散化之后就是 O(n)O(\sqrt n) 级别的了。

然后上面的卷积就用 FFT/NTT 求出来即可,时间复杂度 O(mnlog⁡m)O(m\sqrt n \log m)。

指数生成函数

F^(x)=∑nanxnn!\hat{F}(x)=\sum_{n}a_n \frac{x^n}{n!}

但 F^(x)\hat{F}(x) 实际上也是序列 ⟨ann!⟩\left\langle \dfrac{a_n}{n!} \right\rangle 的普通生成函数。

基本运算

加减法和普通生成函数相同:

F(x)±G(x)=∑n(an±bn)xnn!F(x)\pm G(x)=\sum_n (a_n\pm b_n)\frac{x^n}{n!}

乘法运算:

F^(x)G^(x)=∑i≥0aixii!∑j≥0bjxjj!=∑n≥0xn∑i=0naibn−i1i!(n−i)!=∑n≥0xnn!∑i=0n(ni)aibn−i\begin{aligned} \hat{F}(x)\hat{G}(x) &=\sum_{i\ge 0}a_i\frac{x^i}{i!}\sum_{j\ge 0}b_j\frac{x^j}{j!}\\ &=\sum_{n\ge 0}x^{n}\sum_{i=0}^na_ib_{n-i}\frac{1}{i!(n-i)!}\\ &=\sum_{n\ge 0}\frac{x^{n}}{n!}\sum_{i=0}^n\binom{n}{i}a_ib_{n-i} \end{aligned}

上面的过程是因为组合数 (ni)=n!i!(n−i)!\binom{n}{i} = \frac{n!}{i! (n-i)!},因此

1i!(n−i)!=1n!(ni)\frac{1}{i! (n-i)!} = \frac{1}{n!} \binom{n}{i}

所以:F^(x)G^(x)\hat{F}(x)\hat{G}(x) 是序列

⟨∑i=0n(ni)aibn−i⟩\left\langle \sum_{i=0}^n \binom{n}{i}a_ib_{n-i} \right\rangle

的指数生成函数。

封闭形式

序列 ⟨1,1,1,⋯ ⟩\langle 1,1,1,\cdots\rangle 的指数生成函数是:

F^(x)=∑n≥0xnn!=ex\hat{F}(x) = \sum_{n \ge 0}\frac{x^n}{n!} = \mathrm{e}^x

泰勒展开就行了。

exp 函数

很多时候,指数生成函数会和 exp 函数结合:

exp⁡(x)=ex=∑n=0∞xnn!,x∈C\exp(x) = e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}, \quad x \in \mathbb{C} eA(x)=∑k=0∞A(x)kk!e^{A(x)} = \sum_{k=0}^{\infty} \frac{A(x)^k}{k!}

P4726 【模板】多项式指数函数(多项式 exp)。

组合意义

⟨∑i=0n(ni)aibn−i⟩\left\langle \sum_{i=0}^n \binom{n}{i}a_ib_{n-i} \right\rangle

我们发现这个正是把 nn 个元素划分成 ii 个集合。

广义二项式定理

(a+b)α=∑k=0∞(αk)aα−kbk,(a+b)^{\alpha} = \sum_{k=0}^{\infty} \binom{\alpha}{k} a^{\alpha-k} b^k, (αk)=α(α−1)(α−2)⋯(α−k+1)k!\binom{\alpha}{k} = \frac{\alpha (\alpha-1) (\alpha-2) \cdots (\alpha-k+1)}{k!}
广义组合数

经典组合数:

(nk)=n!k! (n−k)!\binom{n}{k} = \frac{n!}{k!\,(n-k)!}

广义组合数:

(αk)=α(α−1)(α−2)⋯(α−k+1)k!\binom{\alpha}{k} = \frac{\alpha(\alpha-1)(\alpha-2)\cdots(\alpha-k+1)}{k!}

当 α\alpha 是负整数时,可化为带符号的经典组合数:

(−nk)=(−1)k(n+k−1k),n∈N+\binom{-n}{k} = (-1)^k \binom{n+k-1}{k}, \quad n \in \mathbb{N}^+

HDU - 1521 排列组合

HDU - 1521 排列组合。

第 ii 种物品的生成函数是 1+x11!+x22!⋯+xaiai!1+\frac{x^1}{1!}+\frac{x^2}{2!} \cdots +\frac{x^{a_i}}{a_i!}。

(1+x11!+x22!⋯+xa1a1!)(1+x11!+x22!⋯+xa2a2!)⋯(1+x11!+x22!⋯+xanan!)(1+\frac{x^1}{1!}+\frac{x^2}{2!} \cdots +\frac{x^{a_1}}{a_1!})(1+\frac{x^1}{1!}+\frac{x^2}{2!} \cdots +\frac{x^{a_2}}{a_2!}) \cdots (1+\frac{x^1}{1!}+\frac{x^2}{2!} \cdots +\frac{x^{a_n}}{a_n!})

最后我们要求 xmm!\frac{x^m}{m!} 的系数。

生成函数的封闭形式

ex=∑n=0∞xnn!=1+x+x22!+x33!+x44!+⋯e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots e−x=∑n=0∞(−x)nn!=1−x+x22!−x33!+x44!−⋯e^{-x} = \sum_{n=0}^{\infty} \frac{(-x)^n}{n!} = 1 - x + \frac{x^2}{2!} - \frac{x^3}{3!} + \frac{x^4}{4!} - \cdots

POJ - 3734 Blocks

POJ - 3734 Blocks。

红色和绿色的生成函数:

1+x22!+x44!+⋯=ex+e−x21+\frac{x^2}{2!} + \frac{x^4}{4!} + \cdots = \frac{e^x+e^{-x}}{2}

蓝色和黄色的生成函数:

1+x11!+x22!+⋯=ex1+\frac{x^1}{1!} + \frac{x^2}{2!} + \cdots = e^x F(x)=(ex+e−x2)2⋅(ex)2=e4x+2e2x+14=14+∑n=0∞4n4⋅xnn!+∑n=0∞2n+14⋅xnn!=14+∑n=0∞4n+2n+14⋅xnn!\begin{aligned} F(x) &= ( \frac{e^x+e^{-x}}{2})^2 \cdot (e^x)^2 \\ &= \frac{e^{4x} + 2e^{2x} + 1}{4}\\ &= \frac{1}{4} + \sum\limits_{n=0}^{\infty}\frac{4^n}{4} \cdot \frac{x^n}{n!} +\sum\limits_{n=0}^{\infty}\frac{2^{n+1}}{4} \cdot \frac{x^n}{n!}\\ &=\frac{1}{4} + \sum\limits_{n=0}^{\infty}\frac{4^n + 2^{n+1}}{4} \cdot \frac{x^n}{n!} \end{aligned}

所以最后的答案就是:

4n−1+2n−1(mod10007)4^{n-1} + 2^{n-1} \pmod{10007}

卡特兰数

有一些生成函数的题目需要卡特兰数。而且卡特兰数的递推公式可以用生成函数求。

Cn={1,n=0,∑i=0n−1CiCn−1−i,n>0C_n = \begin{cases} 1, & n = 0, \\ \sum_{i=0}^{n-1} C_{i}C_{n-1-i}, & n > 0 \end{cases}

数列前几项(可以背一下吧,做题可以瞪):

1,1,2,5,14,42,132,429,1430⋯1,1,2,5,14,42,132,429,1430\cdots

卡特兰数还有别的形式:

Cn=1n+1(2nn)=(2n)!n!(n+1)!C_n = \frac{1}{n+1}\binom{2n}{n} = \dfrac{(2n)!}{n!(n+1)!}

P3978 [TJOI2015] 概率论

P3978 [TJOI2015] 概率论。

首先,先定义 gg 表示二叉树的形态有多少种:

cn=∑i=0n−1gign−1−ic_n=\sum_{i=0}^{n-1} g_{i}g_{n-1-i}

我们发现这正是卡特兰数的形式,通项公式就是用生成函数推的。

然后考虑函数 ff 表示 nn 个节点的二叉树的节点个数和。

我们考虑从 n−1n-1 转移。可以发现一个有 n−1n-1 个点的二叉树一共有 (n−1)∗2−(n−2)=n(n-1)*2-(n-2)=n 个空余的节点。我们考虑转移后的组合 (T,d)(T,d) 表示一个树的每一个叶子节点,然后我们可以发现,每一个目标树上的节点都可以从对应的 n−1n-1 的树上转移来,所以:

fi=n∗gif_{i}=n*g_i

所以 nn 个点二叉树叶子个数等于 n−1n-1 个点的个数 ×n\times n。

例题

CF993E Nikita and Order Statistics

CF993E Nikita and Order Statistics。

反转序列构造卷积形式。

思路

首先这道题很容易想到前缀和。

ansk=∑l=1n∑r=1n[sr−sl−1=k]ans_k=\sum_{l=1}^n\sum_{r=1}^n [s_r-s_{l-1}=k]

移项,然后还是用出现次数 cc 来表示。

ansk=∑l=1ncsl−1+kans_k=\sum_{l=1}^n c_{s_{l-1}+k}

然后我们需要消去 ss:

ansk=∑l=1n−kci∗ci+kans_k=\sum_{l=1}^{n-k}c_i*c_{i+k}

然后这一点也不像卷积的形式,于是...我们设 dd 为把 cc 反过来的数组,ci=dn−i+1c_i=d_{n-i+1}。

ansk=∑l=1n−kci×dn−i−kans_k=\sum_{l=1}^{n-k}c_i\times d_{n-i-k}

于是我们用卷积来表示答案:

ansk=c∗d(n−k)ans_k=c*d (n-k)

写完代码发现 ans0ans_0 一直是错的,然后需要特判。原因:可能会计算 l>rl>r 的情况。

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

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

融合生成函数和数论各种知识的好题。

思路

我们可以用 FF 表示出选 kk 个数的生成函数:

∑i=0+∞f(x)i\sum_{i=0}^{+\infty}f(x)^i

然后我们考虑写成封闭形式,我们先推导 FF 的封闭形式:

f(x)=xf(x)+x2f(x)+a0+a1x−a0xf(x)=xf(x)+x2f(x)+xf(x)=x1−x−x2\begin{aligned} f(x)&=xf(x)+x^2f(x)+a_0+a_1x-a_0x\\ f(x)&=xf(x)+x^2f(x)+x\\ f(x)&=\frac{x}{1-x-x^2} \end{aligned}

然后我们再推原来的式子(代入无穷级数公式):

∑i=0+∞f(x)i=∑i=0+∞11−f(x)=1−x−x21−2x−x2=1+x1−x−x2\begin{aligned} \sum_{i=0}^{+\infty}f(x)^i&=\sum_{i=0}^{+\infty}\frac{1}{1-f(x)}\\ &=\frac{1-x-x^2}{1-2x-x^2}\\ &=1+\frac{x}{1-x-x^2} \end{aligned}

现在我们需要求这个生成函数的点值:

x1−x−x2\frac{x}{1-x-x^2}

设这个为 AA:

(1−2x−x2)A(x)=x∑anxn−2∑anxn+1−∑anxn+2=xan=2an−1+an−2(1-2x-x^2)A(x)=x\\ \sum a_nx^n-2\sum a_nx^{n+1}-\sum a_nx^{n+2} = x\\ a_n=2a_{n-1}+a_{n-2}

然后我们需要求通项公式,需要一个叫特征方程的东西:

rn=2rn−1−rn−2r2−2r−1=0r=1±2r^n=2r^{n-1}-r^{n-2}\\ r^2-2r-1=0\\ r=1\pm \sqrt 2

上面的方程是能表示出递推关系的,我们只需要解出可以满足 a0a_0 和 a1a_1 的解就行了。

然后通项公式一定是这个形式的(这个是二阶的函数):

an=A(1+2)n+B(1−2)na_n=A(1+ \sqrt 2)^n+B(1-\sqrt 2)^n

代入 00 和 11,A=−BA=-B,然后解得:

A=122,B=−122A=\frac{1}{2\sqrt2},B=-\frac{1}{2\sqrt2}

通项公式:

an=122(−2+1)n−122(2+1)na_n=\frac{1}{2\sqrt2}(-\sqrt 2+1)^n-\frac{1}{2\sqrt2}(\sqrt 2+1)^n

然后注意到 2\sqrt2 在 10910^9 下存在。