「总结」多项式生成函数相关(3)
今天是生成函数了。
。。。
是我学的最难的多项式部分了。
其实我也可以说是现学现卖,学的不好讲的不好大家见谅。
我之前讲的大部分东西都可以和生成函数相结合。
生成函数分成三种。
我们一个一个来。
1.普通型生成函数(\(OGF\))
对于一个已知的数列\({a_i}\)。
其\(OGF\)为:
例如:\({1}\)的\(OGF\)就是:
很多时候我们用生成函数的原因是,我们可以把一个数列转化成一个简单的形式。
例如\(\frac{1}{1-x}\)
如果我们让两个\(OGF\)相乘会怎么样呢?
简单的例子:
比如说如果我们可以选两个物品,分别从两组中选择。
第一组物品的体积和每种体积的物品种类用数列\({a_i}\)来表示。
第二组物品的体积和每种体积的物品种类用数列\({b_i}\)来表示。
设\({a_i}\)的\(OGF\)为\(A(x)\),\({b_i}\)的\(OGF\)为\(B(x)\)
那么\((A(x)B(x))_i\)就是选择的两个物品的体积和为\(i\)的方案数。
\(OGF\)经常来解决这种组合问题。
例:http://hzoj.com/contest/126/problem/5
裸的容斥题,我们将数列换成生成函数。
设一个的\(OGF\)为\(A(x)\)
两个合在一起的为\(B(x)\)
三个合在一起的为\(C(x)\)
那么答案就是:
做四次\(DFT\)即可。
例:http://hzoj.com/problem/917
也挺裸的。
我们考虑求前缀和的过程是怎么样的。
对于一个数列\({a_i}\),设其前缀和为\({b_i}\)
那么:
这个时候可以用多项式快速幂来搞了。
但是常数过大,\(ln+exp\)
这个题时限开到了\(200ms\)过不掉。
考虑如何优化。
我们设\(A(x)\)为\({1}\)的\(OGF\)。
那么:
考虑一下这个\(OGF\)自乘\(k\)次后第\(i\)项的系数是什么含义。
事实上是取\(k\)个自然数,加和之后为\(i\)的方案。
这样直接用挡板解决就可以了。
这个系数就是:
那么也就是说:
这样就只需要三次\(NTT\)了。
2.指数型生成函数(\(EGF\))
对于一个数列\({a_i}\)
其\(EGF\)为:
比如\(1\)的\(EGF\)为:
同样是一个级数求和。
相比之下\(EGF\)用来解决排列问题。
比如说这样一个问题:
从\(A\)中拿出任意多个相同物品,从\(B\)中拿出任意多个相同物品,如果认为拿出来的物品的顺序不同视为不同方案,求拿出的物品个数为\(i\)的方案数。
设\(EGF\)为:$$G(x)=\sum\limits_{i=0}{\infty}\frac{xi}{i!}$$
设答案数组的\(EGF\)为:$$R(x)=\sum\limits_{i=0}{\infty}\frac{res_i}{i!}xi$$
那么:
这里就没有\(OGF\)那么显然了。
考虑一下为什么。
对于一个可重集合\(S\),设\(\left|S\right|=n\),设其中每种物品的个数为\(a_i\)。
那么这个集合的可重排列的方案就是:
这样我们再来观察这个卷积的过程。
相当于是把相同的物品的系数乘了一个\(\frac{1}{i!}\)
而最后的系数的和下面除了一个\(i!\),相当于可重集合上面乘的\(n!\)。
大概,可以懂吧?
例:http://hzoj.com/contest/126/problem/10
在大神们都用分治发发塔\(AC\)之后,我们再次看一下这道题能否有低于\(nlog^2n\)的复杂度。
设\(n\)个点无向图的个数为\(g(n)=2^{\binom{n}{2}}\),设\(n\)个点联通图的个数为\(f(n)\)。
列出式子:
拆一下:
设\(G_0(x)=\sum\limits_{i=0}^{n}\frac{g(i+1)}{i!}x^i\),\(G_1(x)=\sum\limits_{i=0}^{n}\frac{g(i)}{i!}x^i\),\(F(x)=\sum\limits_{i=0}^{n}\frac{f(i+1)}{i!}x^i\)
这样的话:
也就是一个多项式求逆了。
3.概率生成函数(咕咕咕我不会暂时不想学)\(Upd:\)已经学了。
我们设一个离散型随机变量\(X\)的概率生成函数为:
那么:
也就是说:
这样我们不断的求导下去可以得到:
这样也给除了一种便捷的求方差的方式:
4.应用
先来几个\(EGF\)的。
fr.一个含有\(n\)个点的树,如果令度数最大的点的度数为\(m\),求方案数。
\(prufer\)序列。
转化为长度为\(n-2\)的序列中,\([1,n]\)中的数出现次数最多的为\(m-1\)次的方案数。
继续转化为,出现最大的为\(m-1\)减去出现最大的为\(m-2\)的。
构造生成函数:
那么:
se:http://hzoj.com/contest/126/problem/10
城市规划。还是这个题。
在各位大神甚至用生成函数和多项式求逆\(AC\)这道题之后我还想告诉你:
我们现在用\(EGF\)来搞一个更加无脑的做法。
我们设\(f(n)\)为\(n\)个点有标号无向联通图的个数,\(g(n)=2^{\binom{n}{2}}\)为\(n\)个点有标号无向图。
设\(f(n)\)的\(EGF\)为:
我们枚举一个无向图有几个联通块。
得到如下的式子:
那么:
直接多项式\(ln\)即可。
来几个背包问题:
fr.体积为\(i\)的物品有\(a_i\)种,每种无限个,求\([0,n]\)所有容积的方案。
设体积为\(i\)的物品的\(OGF\)为\(F(x)\)
那么由于有无限个。
首先复习两个级数求和公式:
所以:
设答案数组的\(OGF\)为\(A(x)\)
那么:
也就是说对于第\(j\)项,只需要累加\(j\)的倍数项。
那么复杂度是:
se.体积为\(i\)的物品有\(a_i\)种,每种有一个,求\([0,n]\)所有容积的方案。
设体积为\(i\)的物品的\(OGF\)为\(F_i(x)\)
那么:
设答案数组的\(OGF\)为\(A(x)\)。
那么:
一样是调和级数的复杂度。