生成函数入门

ShanLunjiaJian

胡乱说几句

Saying

生成函数是组合对象在代数结构上的投影。——EI

这句话说的很好,但是当你尝试理解,你会感觉它好像说了什么又好像没有说(

什么是生成函数?

大概是说,把数数问题中的东西翻译成一个函数,然后用代数手段处理它得到数数问题的答案。

禁止使用生成函数

在cts以下的ccf组织的赛事中大概不会出现法法塔,所以那些$O(n\log n)$的法题我们只需要爆力做到$O(n^2)$就好了。

很遗憾,sdoi会出现法法塔。

经典的引入

fib数列的gf。看我口胡。

卷积

gf入门的重要一步就是学会用卷积描述问题。

简单题

求周长为$n$的三角形个数。$n\leq 10^{18}$。

是三角形,等价于三边分别小于$\frac{n}{2}$。表演一下。

另一个简单题

01背包,支持插入一个物品,删除一个物品,查询凑出体积$m$的方案数。$m,q\leq 5000$。

也就是卷上$1+z^k$或$\frac{1}{1+z^k}$。前者是简单的,后者展开考虑其效果。

完全背包呢?

也就是卷上$\frac{1}{1-z^k}$或$1-z^k$。两个都是简单的。

实际上$\frac{1}{1-\alpha z}$都可以$O(n)$地卷上去。

试看看!

luogu2000 拯救世界

CF585E Present for Vitalik the Philatelist

指数生成函数 egf

有些时候我们可能想要描述两个东西有序地插起来,或者说把两个有标号集合合并的时候需要重新分配标号,这种东西对应的卷积称为二项卷积,而二项卷积是egf的普通卷积。

类似地,狄利克雷卷积是狄利克雷生成函数的普通卷积,那么谁来构造一下狄利克雷生成函数?

微积分

求导和积分对应egf的系数平移,正如乘$z$和乘$\frac{1}{z}$对应ogf的系数平移。

生成函数的微积分被称为形式微积分,也就是说它只是按照多项式求导积分这么搞了一个东西,它和原来的求导积分具有几乎一样的性质,但是它不具有任何实际意义,所有的性质都是在形式上成立。有结论保证了我们在处理gf的时候总是不需要考虑收敛性,感觉一下你可能会觉得这很优美。

试看看!

hdu多校 2009 contest5 B. Fibonacci Check-up

给$n$,求$\displaystyle \sum_{i=0}^n\binom{n}{i}f_i$,其中$f$是斐波那契数。

打表观察,发现答案是斐波那契数$f_{2n}$,于是矩阵快速幂就做完了,单组复杂度$O(\log n)$。

这个东西是二项卷积,所以我们使用egf,于是它相当于卷上一个$e^z$。关于fib数的egf,我们有微分方程$F^{\prime\prime}-F^\prime-F=0$,这个实在是懒得解,我们直接卷上$e^z$得到$e^zF^{\prime\prime}-e^zF^\prime-e^zF=0$。我们希望把它凑成$e^zF$的一个微分方程,也就是说求导的时候都是对$e^zF$求导,而不是只对$F$求导。

我们强行做这个事情。

给$e^zF^{\prime\prime}$凑一个$e^zF+2e^zF^\prime$,我们得到$(e^zF)^{\prime\prime}-e^zF^\prime-e^zF=e^zF+2e^zF^\prime$,移项得$(e^zF)^{\prime\prime}-3e^zF^\prime-2e^zF=0$。

给$-3e^zF^\prime$凑一个$-3e^zF$,我们得到$(e^zF)^{\prime\prime}-3(e^zF)^\prime-2e^zF=-3e^zF$,移项得$(e^zF)^{\prime\prime}-3(e^zF)^\prime+e^zF=0$,于是我们知道它的递归式就是$a_n=3a_{n-1}-a_{n-2}$。同时斐波那契数的递归式是$f_{2n}=f_{2n-1}+f_{2n-2}=2f_{2n-2}+f_{2n-3}=3f_{2n-2}-f_{2n-4}$,所以它俩确实是一样的。

这个题的启发是,生成函数的封闭形式固然体现了它的性质,但是有些时候它所满足的方程更加实用。在处理微分方程的时候这一点尤为突出,因为微分方程很难解出一个封闭形式,但是它确定了系数的递推式,更准确地说是一个整式递推。

强连通竞赛图计数

求$n$个点的有标号强连通竞赛图数量。你只需要给出它的egf。

可以发现任意竞赛图是若干个强连通竞赛图串起来,而任意竞赛图是容易数的。考虑建立它们之间的方程。

设$[z^0]G=1,n![z^n]G=2^{\frac{n(n-1)}{2}}$为任意竞赛图的egf,可以知道$G=GF+1$,也就是任意非空竞赛图是$1$所在的scc和剩下的部分拼起来,而空竞赛图是$1$,于是我们知道$F=1-\frac{1}{G}$。

ln,exp

让我来表演一下默写定义。

可以看出$\exp$的组合意义,也就是选择任意个东西无序地拼起来,而$\ln$是其逆运算。

它叫$\exp$是因为具有那个组合意义的式子正好跟$e^z$的泰勒展开式一样,而$\ln$是$\ln$在$1$处泰勒展开得到的东西。

有标号有根树

求$n$个点的有标号有根树数量,不区分儿子的顺序。你只需要给出egf方程。

$F=z\exp F+1$,也就是非空树是任意个儿子无序地拼起来再接上自己,空树就没有自己了,并且空树只有一种。

根据prufer序列的结论,或者直接对这个拉格朗日反演,可以知道$[z^n]F=n^{n-1}$。

基环树

求$n$个点的有标号内向基环树数量。

注意到内向基环树每个点有恰好一条出边,于是考虑每个点有恰好一条出边的图是内向基环树森林,这样的图有$n^n$个,看起来它是内向基环树的$\exp$,所以我们对内向基环树森林取$\ln$即可。

计算加减乘除导数积分$\ln,\exp$

加减乘和微积分是简单的,根据定义算就好了。加减微积分是线性,乘是$O(n^2)$。

除也就是求逆,求$G$的逆,设为$F$,说的是$\sum\limits_{i+j=k}f_ig_j=[k=0]$这样的,所以从低到高做,就得到一个$f_k$的方程。

$\ln$的话,考虑$(\ln G)^\prime=\frac{G^\prime}{G}$,所以可以一次求逆,一次乘法,一次积分搞定。

$\exp$的话,考虑$(\exp G)^\prime=G^\prime\exp G$,两边提取$[z^k]$我们得到$(k+1)f_{k+1}=\sum\limits_{i+j=k}g^\prime_if_j$这样的。

可以用$\ln-\exp$实现幂,也就是$\exp \ln F^n=\exp n\ln F$。需要注意常数项是$1$才能$\ln$,常数项是$0$才能$\exp$,所以这个需要提一提这样的。也可以直接求导,也就是$(F^n)^\prime=nF^{n-1}F^\prime$,然后提取系数也结束了。当你不知道干什么的时候就求个导。

试看看!

卡特兰数

卡特兰数定义为$n$个点的无标号二叉树个数,区分左右儿子。请给出卡特兰数的ogf和通项。

$\displaystyle\frac{1-\sqrt{1-4z}}{2z}$。

展开的时候会出现$1\times 3\times 5\times 7...$这样的东西,注意到缺失的项类似于$2^nn!$即可。

sdoi2017 序列计数

循环卷积也就是膜$z^p-1$的卷积。这里说一下如何理解多项式膜多项式。

可以直接用卷积描述。

cf1515E Phoenix and Computers(空的题?)

考虑最后的情况是有若干段,每一段必然是从中间某个位置往两边选走选出来的。

考虑时间倒流,可以知道,长$l$的段方案数就是$2^{l-1}$。

考虑一段的egf,它是$\displaystyle\sum_{i=1}^\infty\frac{2^{i-1}z^i}{i!}=\frac{1}{2}(e^{2z}-1)$。

枚举选了多少个空,答案就是$\displaystyle\sum_{i=0}^n[z^{n-i}]\left(\frac{e^{2z}-1}{2}\right)^{i+1}$。每次卷一个东西上去即可,容易$O(n^3)$计算。

为了做到$O(n^2)$,考虑使用二项式定理展开后面的东西。

十二重计数法

有$n$个球和$m$个盒子,球要全部装进盒子里,还有一些限制条件(接下来逐个给出),求放完之后可能的情况有多少种?

你可以只给出关于$n,m$多项式复杂度的计算方法(而不必优化到$O(n\log n)$)。

1. 球之间互不相同,盒子之间互不相同。

$m^n$。

2. 球之间互不相同,盒子之间互不相同,每个盒子至多装一个球。

先考虑哪些盒子装了,然后分配,也就是$\displaystyle\binom{m}{n}n!=m^{\underline{n}}$。

3. 球之间互不相同,盒子之间互不相同,每个盒子至少装一个球。

容斥,答案是$\displaystyle\sum_{i=0}^n(-1)^i\binom{m}{i}(m-i)^n$。

4. 球之间互不相同,盒子全部相同。

也就是说一个盒子由它里面的球来区分,只要一个盒子装了球它就可以和别的盒子区分开,而所有没装的盒子是一样的,于是枚举有多少个盒子装了球。那么可以发现这个就是斯特林子集数(第二类斯特林数)。问题是求第二类斯特林数行前缀和,递推即可。

5. 球之间互不相同,盒子全部相同,每个盒子至多装一个球。

如果$n\leq m$答案是$1$,否则是$0$。

6. 球之间互不相同,盒子全部相同,每个盒子至少装一个球。

直接就是斯特林子集数。

7. 球全部相同,盒子之间互不相同。

使用隔板法,答案是$\binom{n+m-1}{m-1}$。

8. 球全部相同,盒子之间互不相同,每个盒子至多装一个球。

$\binom{m}{n}$。

9. 球全部相同,盒子之间互不相同,每个盒子至少装一个球。

相当于7中先往每个盒子放一个,所以答案是$\binom{n}{m-1}$。

10. 球全部相同,盒子全部相同。

考虑因为球无标号,盒子之间的区别就是球的个数;因为盒子无标号,我们可以任意重排,所以不妨把它排序。然后你就可以dp了,不过这里我们用gf来理解它。

相当于我们要选若干个大小为$0$的盒子,大小为$1$的盒子,大小为$2$的盒子......其中大小为$k$的盒子的gf应该是$\frac{1}{1-tz^k}$,这里我们引入一个新变量$t$,它的指数表示盒子的个数,最后答案就是提取$z^nt^m$这一项。也就是说我们要求$\displaystyle[z^nt^m]\prod_{k=0}^\infty\frac{1}{1-tz^k}$。但是二元gf比较复杂,能不能避开它?

这个东西看起来像分拆数,我们画一个Ferrers图 :

可以发现转置之后,从$m$个盒子,每个盒子放任意个球,变成了任意个非空盒子,每个盒子放不超过$m$个球。有人来写一下现在答案是什么吗?

$\displaystyle[z^n]\prod_{k=1}^m\frac{1}{1-z^k}$。

$\displaystyle[z^n]\prod_{k=1}^m\frac{1}{1-z^k}$。

现在计算这个是$O(n^2m)$的。考虑如何优化到$O(n^2)$。

$$ \begin{aligned} &[z^n]\prod_{k=1}^m\frac{1}{1-z^k}\\ =&[z^n]\frac{1}{\prod\limits_{k=1}^m(1-z^k)}\\ =&[z^n]\frac{1}{\exp -\sum\limits_{k=1}^m\sum_{i=1}^\infty\frac{z^{ki}}{i}}\\ =&[z^n]\frac{1}{\exp -\sum_{i=1}^\infty\frac{1}{i}\sum\limits_{k=1}^mz^{ki}}\\ \end{aligned} $$

因为右边那个东西只对$z^{ki}$这样的项有贡献,我们直接算就是调和数的$O(n\log n)$,然后$\exp$再求逆就好了。

套路就是,看到一串东西乘起来,就考虑取$\ln$变成一串东西加起来,最后$\exp$回去。

11. 球全部相同,盒子全部相同,每个盒子至多装一个球。

如果$n\leq m$答案是$1$,否则是$0$。

12. 球全部相同,盒子全部相同,每个盒子至少装一个球。

类似于9,先往每个盒子放一个即可。

Saying again

生成函数是组合对象在代数结构上的投影。——EI

这句话说的很好,但是当你尝试理解,你会感觉它好像说了什么又好像没有说(

Thanks for Listening!

Powered by reveal.js