生成函数

生成函数知识点总结。

简单的介绍

对于一个序列 ${a_0,a_1\cdots}$,我们想把这个数列表示出来,把它写成一个函数的形式。因此就有了以下的两种形式:

  • 普通型生成函数(OGF):$f(x)=\sum_{i=0}a_ix^i$ ,主要用来解决无标号,组合问题。

  • 指数级生成函数(EGF):$f(x)=\sum_{i=0}\frac{a_i}{i!}x^i$ ,主要用来解决有标号,排列问题。

主要和多项式各种运算搭配使用。

一些例子:

OGF:

  • ${ 1,1,1,\cdots}$ 的OGF为:$\sum_{i=0}x^i=\frac{1}{1-x}$

  • ${ 1,a,a^2,\cdots}$ 的OGF为:$\sum_{i=0}a^ix^i=\frac{1}{1-ax}$

  • ${ 1,-1,1,-1,\cdots}$ 的OGF为:$\sum_{i=0}(-1)^ix^i=\frac{1}{1+x}$

  • $\frac{1}{1-x}$ 求 $n$ 次导得到的是杨辉三角第 $n+1$ 列的数。

EGF:

  • ${1,1,1,\cdots}$的EGF为:$\sum_{i=0}\frac{x^i}{i!}=e^x$
  • $\frac{e^x+e^{-x}}{2}=\sum_{i=0}\frac{x^{2i}}{(2i)!}$
  • $\frac{e^x-e^{-x}}{2}=\sum_{i=0}\frac{x^{2i+1}}{(2i+1)!}$
  • $\ln(1-x)=-\sum_{i=1}\frac{x^i}{i}$

应用

图计数问题

以下问题,$n\leq 10^5$。模$998244353$。

带标号无向图数量

$f_i=2^{\binom{i}{2}}$

带标号无向连通图数量

设答案为$g_i$,其生成函数为$G$,第1题的生成函数是$F$,那么一个无向图就是由一些无向连通图组合起来的。

那么可以枚举一个无向图是由多少个连通图组成的,假设为$i$,那么答案跟$F^i(x)$所对应的系数有关系。因为无序,所以要除一个$i!$,因此有:

$F(x)=\sum_{i=0}^{\infty}\frac{G^i(x)}{i!}=e^{G(x)}$

同时求$\ln$得$G(x)=\ln F(x)$

多项式求$\ln$即可。

带标号DAG数量

很明显先dp,设$f_i$为$i$个点带标号的DAG数量。$f_0=1$。先假设有$j$个点度数为0,符合上述条件的$j$个点的集合有$\binom{i}{j}$个;这$j$个点可以任意向其他$i-j$个点连边,方案数有$2^{j(i-j)}$个;剩下的$i-j$个点也必须是个DAG,方案数为$f_{i-j}$乘法原理得方案数为$\binom{i}{j}2^{j(i-j)}f_{i-j}$,可是剩下的$i-j$个点中也还是有一些度数为0的点的,那么容斥一下就好了。

得到dp方程式:$f_i=\sum_{j=1}^i(-1)^{j-1}\binom{i}{j}2^{j(i-j)}f_{i-j}$

时间复杂度$O(n^2)$

考虑优化,式子右边很像一个卷积形式,但是$2^{j(i-j)}$很难化简。。。

可以发现,$2^{j(i-j)}={2^{j^2}}\times {2^{-ij}}$,有没有办法把$-ij$化成只跟$j$和$i-j$和$i$有关的东西乘起来呢?

初中知识:$(i-j)^2=i^2+j^2-2ij$

因此$2^{i(i-j)}={2^{i^2}}\times {2^{-ij}}=(\sqrt{2})^{i^2-(i-j)^2-j^2}$

那$\sqrt{2}$在模$998244353$意义下是什么来的呀?

不用怕,$2$在模$998244353$意义下有二次剩余的呢。

因此$dp$式可化成:

$$\frac{f_i}{(\sqrt{2})^{i^2}i!}=\sum_{j=1}^i\frac{(-1)^{j-1}}{(\sqrt{2})^{j^2}j!}\times \frac{f_{i-j}}{(\sqrt{2})^{({i-j})^2}(i-j)!}$$

设$F(i)=\frac{f_i}{(\sqrt{2})^{i^2}i!}$,$G(i)=\frac{(-1)^{i-1}}{(\sqrt{2})^{i^2}i!}(i\geq1),G(0)=0$

那么$F=GF+1$,即$F=\frac{1}{1-G}$

多项式求逆,时间复杂度$O(n \log n)$

带标号的DAG数量,要求图弱连通

和第二题是一样的。设$H(x)$为该题答案的指数型生成函数,$F(x)$为第三题的指数型生成函数,那么$F(x)=e^{H(x)}$,$H(x)=\ln F(x)$,多项式求$\ln$即可。

拉格朗日反演

若两个函数 $F(x),G(x)$ 满足:$F(G(x))=x$。

则有:$[x^n]G(x)=\frac{1}{n}[x^{n-1}] (\frac{x}{F(x)})^n$

证明:懒得证了,会用就行。