指数生成函数学习笔记&做题记录

咕咕了好久,指数生成函数 (EGF) 它终于来了!

前置知识

普通生成函数

多项式计数


一些定义

指数生成函数 (EGF) 指下面这种形式的生成函数:

\[\hat A(x)=\sum_{i \ge 0} \frac{a_i}{i!}x^i \]

卷积形式:

\[\hat A(x)\hat B(x)=\sum_{i\ge 0} \frac{x^i}{i!}\sum_{j=0}^i \binom{i}{j}a_jb_{i-j} \]

这个直接把 \(i!\) 移动到后面去就好了。

从这个式子可以发现,两个 EGF 卷起来本质上就是先在 \(A\) 里面选 \(j\) 个,然后在 \(B\) 里面选 \(i-j\) 个,然后排成一排的方案数。

有啥用

指数生成函数主要解决有标号的图的计数问题。

在解决这个之前,我们先要解决它的封闭形式。

对于 \(a_i=1\),来说,它的生成函数就是:

\[\hat A(x)=\sum_{i\ge 0}\frac{x^i}{i!}=e^x \]

这个可以使用泰勒展开证明。

同理,对于 \(a_i=p^i\) 形式,那么同理, \(\hat A(x)=e^{px}\)

还有一个比较重要的,就是 \(a_i=(i-1)!\),此时 \(\hat F=\sum \frac{x^n}{n}=-\ln(1-x)\)

会求这个东西之后,可以来解决有标号图计数问题。

具体作用就是,EGF 可以实现一般图连通图直接的转化。

假设 \(n\) 个点的一般图的 EGF 是 \(\hat F\),连通图是 \(\hat G\),(连通块无标号)。

那么结论是:

\[\hat F=e^{\hat G}\\ \hat G=\ln \hat F \]

这两个直接做都是 \(O(n\log n)\)

考虑证明它,对第一个进行证明,考虑对于一个一般图,枚举一下连通块个数。

\[f_n=\sum_{i\ge 0}\frac{1}{i!}\sum_{a_1+a_2+...a_i=n}\binom{n}{a_1,a_2...,a_i}\prod_{j=1}^i g_{a_j} \]

后面的好理解,考虑前面的 \(\frac{1}{i!}\) 是啥。

考虑把每个点放到 \(i\) 个集合中的一个,那么每个数可以随便选,但是对于一种选法,可以把集合的编号进行随意排列,这样得到的计数结果会重复,所以除掉这样的 \(i!\)

然后直接化简:

\[\frac{f_n}{n!}=\sum_{i\ge 0}\frac{1}{i!}\sum_{a_1+a_2+...a_i=n}\prod_{j=1}^i \frac{g_{a_j}}{(a_j)!}\\ \hat F_n=\sum_{i\ge 0}\frac{1}{i!}\sum_{a_1+a_2+...a_i=n}\prod_{j=1}^i \hat G_{a_j}\\ =[x^n] \sum_{i\ge 0}\frac{(\hat G)^i}{i!} \\ \hat F=e^{\hat G} \]

还有一个阴间情况是连通块有标号,那么就是相当于前面的式子没有 \(\frac{1}{i!}\)。用类似的方法可以推出。

\[\hat F = \sum (\hat G)^i=\frac{1}{1-\hat G} \]


下面是有标号计数大杂烩。


  • 有标号无根树、森林计数。

树直接 purfer 序列,答案是 \(n^{n-2}\),森林的话就直接求 \(\exp\) 即可。


  • 有标号有根树、森林计数。P4981

树直接 purfer 然后去定一个根,\(n^{n-1}\),森林有一个更优美的做法,把所有根连向 \(0\),然后就可以直接 purfer 了,答案是 \((n+1)^{n-1}\)


  • 有标号无向图计数。P4841

不连通直接

\[f_n=2^{\frac{n(n-1)}{2}} \]

然后转 EGF,求 \(\ln\) 即可。

code


  • 有标号 DAG 计数。P6295

考虑不连通咋做,是 bzoj2863

考虑一张 DAG 中,如果把所有入度为 \(0\) 的点扔掉,那么必然还是一个 DAG,所以可以枚举有几个点入度为 \(0\),然后会发现这个东西需要容斥,式子就是:

\[f_n=\sum_{i=1}^n (-1)^{i-1} 2^{i(n-i)}\binom{n}{i}f_{n-i} \]

暴力做复杂度 \(O(n^2)\),可以过上面的题。

考虑化简。

\[\frac{f_n}{n!}=\sum_{i=1}^n \frac{(-1)^{i-1}}{i!}\frac{f_{n-i}}{(n-i)!}2^{i(n-i)} \]

此时有一个问题就是说 \(2^{i(n-i)}\) 做不了。

考虑把它变成可以用 \(i,n-i,n\) 表示的东西。

可以发现 \(2^{ab}=2^{\frac{(a+b)^2-a^2-b^2}{2}}\),这样就可以了。

但有一个问题,就是除二不一定可以整除,会寄,可以把 \(2\) 变成 \(\sqrt{2}\) 然后求二次剩余,但是太麻烦了。

考虑换一下:\(2^{ab}=2^{\frac{(a+b)(a+b+1)-a(a+1)-b(b+1)}{2}}\),此时就可以拆了。

拿去原式,变成:

\[\frac{f_n}{n!2^\frac{n(n+1)}{2}}=\sum_{i=1}^n \frac{(-1)^{i-1}}{i!2^\frac{i(i+1)}{2}}\frac{f_{n-i}}{(n-i)!2^{\frac{(n-i)(n-i+1)}{2}}} \]

此时有一个寻宝做法,直接分治 NTT 求,时间复杂度 \(O(n\log^2 n)\)

AK 做法是,直接换成 \(F=GF+1\) 的形式,直接多项式求逆,时间复杂度 \(O(n\log n)\)

连通的话直接求 \(\ln\) 即可。

code


  • 有标号二分图计数。P7364

先可以得到一个很寻宝的东西:

\[f_n=\sum_{i=1}^n \binom{n}{i}2^{i(n-i)} \]

也就是选出一些点到一边,剩下在另一边的方案数。

这样会有一个问题,就是说可能不联通,而且多一个连通块方案数就会乘 \(2\),因为可以放左边也可以放右边。

对上面的式子变形:

\[f_n=\sum_{i\ge 0}\frac{2^i}{i!}\sum_{a_1+a_2+...a_i=n}\binom{n}{a_1,a_2...,a_i}\prod_{j=1}^i g_{a_j}\\ \hat F=\sum_{i\ge 0} \frac{2^i(\hat G)^i}{i!}=e^{2\hat G} \]

这样可以直接求联通的个数。

求不连通的,就相当于求 \(\ln\)\(\exp\),那么可以发现 \(\hat H=\sqrt{\hat F}\)。直接开根即可。

code


  • 有标号强联通竞赛图计数。

\(f\) 表示竞赛图,\(g\) 表示强联通竞赛图,显然就是先变成若干个强连通块,然后对强连通块标号,使得满足拓扑关系。

所以

\[\hat F=\frac{1}{1-\hat G}\\ \hat G=\frac{\hat F-1}{\hat F} \]


考虑一个盒子 \(n\) 个不同的球,需要盒子非空,显然方案数为 \([n\ge 1]\),其 EGF 就是 \(e^x-1\)

然后考虑答案就是若干组上面的东西卷起来。

因为盒子相同,组合起来就是

\[\hat G=\sum \frac{(\hat F)^i}{i!}\\ =e^{e^{x}-1} \]


posted @ 2022-05-30 20:47  houzhiyuan  阅读(266)  评论(0编辑  收藏  举报