“生命是自然的奇迹,归心是灵魂的光彩。”
生成函数
又可以被称为母函数($\text{Generating Function,GF}$),是一种形式幂级数,其每一项的系数都对应原序列的信息,一般用 $F(x)=\sum a_nk_n(x)$ 表示。
其中 $a_n$ 表示系数,$k_n(x)$ 是核函数,不同的核函数可以通过求导得到不同的生成函数。
常见的生成函数:
- 普通生成函数 $k_n(x)=x^n$ ;
- 指数生成函数 $k_n(x)=\frac{x^n}{n!}$ ;
- 狄利克雷生成函数 $k_n(x)=\frac{1}{x^n}$ 。
一般有定义为 $a_n=[k_n(x)]F(x)$ ,表示第 $n$ 项核函数对应的系数。
普通生成函数
序列 $a$ 的普通生成函数($\text{Ordinary Generating Function,OGF}$)定义为形式幂级数 $F(x)=\sum_na^nx^n$ 。
无论 $a$ 有序无序,有界无界,是否收敛,是否有限,$a$ 的 $\operatorname{OGF}$ 都是存在的。
例如:
- 序列 $\{1,2,3\}$ 的普通生成函数是 $1+2x+3x^2$ ;
- 序列 $\{1,1,1..\}$ 的普通生成函数是 $\sum_{n\ge 0}x^n=\frac{1}{1-x}$ ;
- 序列 $\{1,p,p^2,p^3…p^k\}$ 的普通生成函数是 $\frac{1}{1-px}$ 。
有一个较明显的性质:
数列的加法对应生成函数的加法,而数列的卷积对应生成函数的乘法。
生成函数有级数形式,也存在其封闭形式。由等比数列的求和公式可以得到:$1+x+x^2+…$ 可以表示为 $\frac{1}{1-x}$ 。
等比数列
- 定义式:$\frac{a_n}{a_{n-1}}=q(n\ge 2,a_{n-1}\ne 0,q\ne 0)$ ;
- 通项公式:$a_n=a_1\times q^{n-1}$ ;
- 求和公式:$S=\begin{cases}na_1&,q=1\\\frac{a_1(1-q^n)}{1-q}&,q\ne 1\end{cases}$ 。
而对于 $1+x+x^2…+x^{\infty}$ 的求和公式是通过极限的思想得到的:
相当于是 $x^{\infty}$ 可以忽略不计。
其实我觉得上面这个方法是不严谨的,所以有了第二种解释
第二种解释是,对于这个数列,它是无限的,所以满足性质:
$F(x)x+1=F(x)$
即我们将 $F(x)$ 的每一位都乘上 $x$ 在添上本身的第一项 $1$ ,它是与原数列等价的(因为数列无线)。
所以我们将 $F(x)$ 作为未知数,解这个方程:
得到 $F(x)=\frac{1}{1-x}$ 。
运用
生成函数广泛运用于组合计数中。
模型一
对于 $m$ 件物品,每一种物品只有 $1$ 件,求取 $n$ 件物品的总方案数。
构造单个物品的生成函数为 $1+x$ ,则 $m$ 种物品的生成函数就是 $(1+x)^m=\sum\limits_{i=0}^mC^i_mx^m$ ,通过二项式定理展开得到 $n$ 次项的系数为 $C^n_m$ 。
模型二
对于 $m$ 件物品,每一种物品有无数件,求取 $n$ 件物品的总方案数。
依然选择构造单个生成函数为 $1+x+x^2+…=\frac{1}{1-x}$ ,得到 $m$ 种物品的生成函数就是:
这是通过广义二项式定理展开得到的。
也可以得到第 $n$ 次项的系数就是 $C^{m-1}_{m+n-1}$ ,从组合数学的意义上而言,这道题等价于把 $n$ 个相同的球放进 $m$ 个不同的盒子的方案数。通过隔板法也可以得到最后的式子。
广义二项式定理
首先应该知道二项式定理:
$\left(^n_m\right)=\frac{n!}{m!(n-m)!}$
其中 $n,m$ 都指整数。
那么牛顿广义二项式定理就是把 $n$ 扩展到了实数范围,则有:
$(x+y)^{\alpha}=\sum\limits_{k=0}^{\infty}\left(^{\alpha}_k\right)x^{\alpha-k}y^k$ 。
其中 $\left(^{\alpha}_k\right)$ 表示 $\frac{\alpha(\alpha-1)(\alpha-2)…(\alpha-k+1)}{k!}=\frac{(\alpha)_k}{k!}$ 。
例题
BZOJ 3028
没有链接。
似乎是一道非常模板的生成函数题,直接根据每一种食物建立生成函数之后相乘即可。计算得到 $f(n)=\frac{x}{(1-x)^4}$ 。
而我们需要求得的答案为 $[x^n]F(x)$ ,即 $[x^{n-1}]\frac{1}{(1,x)^4}$ ,是 $4$ 个 $\frac{1}{1-x}$ 卷积的结果。
如果从组合数学的方式考虑,用插板法得出答案为 $(^{n+2}_3)$ 。
P2000
这道题的考点压根就不在生成函数,而是如何使用 $\text{NTT}$ 来优化 $n\leq 10^{10^{5}}$ 的高精度。
总结
这里给出一个不成文的结论:
对于普通生成函数而言,可以转换为下面两类模型:
- 所取的数是 $k$ 的倍数;
- 所取的数不超过 $k$ 。
这样的话,设其生成函数 $f$ 则有:
- $f_1=1+x^{k}+x^{2k}+\cdots+x^{\infty}$
- $f_2=1+x+x^2+x^3+\cdots+x^k$
然后使用错位相减法,得到:
- $f_1=\frac{1}{1-x^k}$
- $f_2=\frac{1-x^{k+1}}{1-x}$
实际上,这是一个更加通常的公式:
对于一个集合 $S=\{a_1,a_2,a_3,a_4,a_5,a_6\cdots a_p\}$ ,其生成函数为:
$f=x^{a_1}+x^{a_2}+x^{a_3}+x^{a_4}+\cdots+x^{a_p}$
当然,这里的 $a_p$ 如果是有限项的话,一般这里的 $a$ 都是一个等差数列;如果这里的 $a_p$ 是无限项的话,一般都是一个等比数列。总之,可以使用错位相减法使其消掉一大部分,否则,就是使用 $\text{FFT}$ 或者 $\text{NTT}$ 来优化多项式卷积以达到 $\mathcal O(n\log n)$ 的复杂度。
指数生成函数
序列 $a$ 的指数生成函数($\text{Exponential Generating Function,EGF}$)被定义为形式幂级数 $F(x)=\sum_{n}a^n\frac{x^n}{n!}$ 。
有几个例子:
- 序列 $\{1,1..1\}$ 的 $\text{EGF}$ 为 $e^x$ ;
- 序列 $\{1,p,p^2…p^k\}$ 的 $\text{EGF}$ 为 $e^{px}$ 。
排列数对应序列的 $\text{EGF}$ 是 $F(x)=\sum_{n\ge 0}\frac{n!x^n}{n!}=\frac{1}{1-x}$ 。
例题
圆排列数
将 $n$ 个数排成一个环,求方案数。方案不同当且仅当其无限循环的母串不同。
$n$ 个数的圆排列数是 $(n-1)!$ 。
圆排列数的 $\text{EGF}$ 是 $G(x)=\sum_{n\ge 0}\frac{(n-1)!x^n}{n!}=\sum_{n\ge 0}\frac{x^n}{n}=\ln(\frac{1}{1-x})$ 。
对于这道题的另一解法,从组合的意义上来理解。
将一个排列 $p$ 看作是一个图,从数点 $i$ 有一条出边指向 $p_i$ ,那么整个图是一个由若干个环组成的(称为置换环),而每个环的内部方案数就是圆排列数。
从而把长度为 $n$ 的排列的方案数就是把 $1,2,3..n$ 分成若干个集合,每个集合的圆排列数积的总和,就是 $\exp$ 在 $\text{EGF}$ 中的组合意义。
同理,有标号生成树的 $\text{EGF}$ 经过 $\exp$ 后得到有标号生成森林的 $\text{EGF}$ ,有标号无向连通图的 $\text{EGF}$ 经过 $\exp$ 后得到有标号无向图的 $\text{EGF}$ 。
取 $\ln$ 就是相应的逆运算。