「总结」多项式生成函数相关(3)

今天是生成函数了。
。。。
是我学的最难的多项式部分了。
其实我也可以说是现学现卖,学的不好讲的不好大家见谅。
我之前讲的大部分东西都可以和生成函数相结合。
生成函数分成三种。
我们一个一个来。

1.普通型生成函数(\(OGF\)
对于一个已知的数列\({a_i}\)
\(OGF\)为:

\[F(x)=\sum\limits_{i=0}^{\infty}a_ix^i \]

例如:\({1}\)\(OGF\)就是:

\[F(x)=\sum\limits_{i=0}^{\infty}x^i=\frac{1}{1-x} \]

很多时候我们用生成函数的原因是,我们可以把一个数列转化成一个简单的形式。
例如\(\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)\)
那么答案就是:

\[\frac{A^3(x)-3A(x)B(x)+2C(x)}{6}+\frac{A^2(x)-B(x)}{2}+A(x) \]

做四次\(DFT\)即可。

例:http://hzoj.com/problem/917
也挺裸的。
我们考虑求前缀和的过程是怎么样的。
对于一个数列\({a_i}\),设其前缀和为\({b_i}\)
那么:

\[{b_i}={a_i}*{1}=\sum\limits_{j=0}^{i}a_j \]

这个时候可以用多项式快速幂来搞了。
但是常数过大,\(ln+exp\)
这个题时限开到了\(200ms\)过不掉。
考虑如何优化。
我们设\(A(x)\)\({1}\)\(OGF\)
那么:

\[A(x)=\sum\limits_{i=0}^{n}x^i \]

考虑一下这个\(OGF\)自乘\(k\)次后第\(i\)项的系数是什么含义。
事实上是取\(k\)个自然数,加和之后为\(i\)的方案。
这样直接用挡板解决就可以了。
这个系数就是:

\[\binom{i+k-1}{k-1} \]

那么也就是说:

\[A^k(x)=\sum\limits_{i=0}^{n}\binom{k+i-1}{k-1}x^i \]

这样就只需要三次\(NTT\)了。

2.指数型生成函数(\(EGF\))
对于一个数列\({a_i}\)
\(EGF\)为:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{a_i}{i!}x^i \]

比如\(1\)\(EGF\)为:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}=e^x \]

同样是一个级数求和。
相比之下\(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$$
那么:

\[R(x)=G^2(x) \]

这里就没有\(OGF\)那么显然了。
考虑一下为什么。
对于一个可重集合\(S\),设\(\left|S\right|=n\),设其中每种物品的个数为\(a_i\)
那么这个集合的可重排列的方案就是:

\[\frac{n!}{\prod\limits_{i=1}^{w}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(n)=\sum\limits_{i=1}^{n}\binom{n-1}{i-1}f(i)g(n-i) \]

拆一下:

\[g(n)=\sum\limits_{i=1}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}f(i)g(n-i) \]

\[\frac{g(n)}{(n-1)!}=\sum\limits_{i=1}^{n}\frac{f(i)}{(i-1)!}\frac{g(n-i)}{(n-i)!} \]

\(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\)
这样的话:

\[G_0(x)=F(x)G_1(x) \]

\[F(x)=\frac{G_0(x)}{G_1(x)} \]

也就是一个多项式求逆了。

3.概率生成函数(咕咕咕我不会暂时不想学)\(Upd:\)已经学了。
我们设一个离散型随机变量\(X\)的概率生成函数为:

\[F(x)=\sum\limits_{i=0}^{\infty}P(X=i)x^i \]

那么:

\[F'(x)=\sum\limits_{i=0}^{\infty}iP(X=i)x^i \]

也就是说:

\[F'(1)=\sum\limits_{i=0}^{\infty}iP(X=i)=E(X) \]

这样我们不断的求导下去可以得到:

\[F^{(k)}(1)=\sum\limits_{i=0}^{\infty}i^{\underline{k}}P(X=i)=E(X^{\underline{k}}) \]

这样也给除了一种便捷的求方差的方式:

\[\begin{aligned} Var(X)&=E((X-E(X))^2)\\ &=E(X^2-2XE(X)+E^2(X))\\ &=E(X^2)-2E(X)E(X)+E^2(X)\\ &=E(X^2)-E^2(X)\\ &=E(X(X-1))+E(X)-E^2(X)\\ &=F''(1)+F'(1)-(F'(1))^2\\ \end{aligned}\]

4.应用
先来几个\(EGF\)的。

fr.一个含有\(n\)个点的树,如果令度数最大的点的度数为\(m\),求方案数。

\(prufer\)序列。
转化为长度为\(n-2\)的序列中,\([1,n]\)中的数出现次数最多的为\(m-1\)次的方案数。
继续转化为,出现最大的为\(m-1\)减去出现最大的为\(m-2\)的。
构造生成函数:

\[F(x)=\sum\limits_{i=0}^{m-1}\frac{x^i}{i!} \]

那么:

\[ans=[x^{n-2}]F^n(n) \]

se:http://hzoj.com/contest/126/problem/10
城市规划。还是这个题。
在各位大神甚至用生成函数和多项式求逆\(AC\)这道题之后我还想告诉你:

\[我没有脑子都可以切这题。 \]

我们现在用\(EGF\)来搞一个更加无脑的做法。
我们设\(f(n)\)\(n\)个点有标号无向联通图的个数,\(g(n)=2^{\binom{n}{2}}\)\(n\)个点有标号无向图。
\(f(n)\)\(EGF\)为:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{f(i)x^i}{i!} \]

\[G(x)=\sum\limits_{i=0}^{\infty}\frac{g(i)x^i}{i!} \]

我们枚举一个无向图有几个联通块。
得到如下的式子:

\[G(x)=\sum\limits_{i=0}^{\infty}\frac{F^i(x)}{i!}=e^{F(x)} \]

那么:

\[F(x)=ln(G(x)) \]

直接多项式\(ln\)即可。

来几个背包问题:
fr.体积为\(i\)的物品有\(a_i\)种,每种无限个,求\([0,n]\)所有容积的方案。
设体积为\(i\)的物品的\(OGF\)\(F(x)\)
那么由于有无限个。
首先复习两个级数求和公式:

\[\sum\limits_{i=0}^{\infty}x^j=\frac{1}{1-x} \]

\[\sum\limits_{i=1}^{\infty}\frac{x^j}{j}=-ln(1-x) \]

所以:

\[F(x)=\sum\limits_{i=0}^{\infty}(x^i)^j \]

设答案数组的\(OGF\)\(A(x)\)
那么:

\[\begin{aligned}\\ A(x)&=\prod\limits_{i=1}^{n}F_i^{a_i}(x)\\ &=\prod\limits_{i=1}^{n}(\sum\limits_{i=0}^{\infty}(x^i)^j)^{a_i}\\ &=\prod\limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}\\ &=exp(ln(\prod\limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}))\\ &=exp(\sum\limits_{i=1}^{n}a_i(0-ln(1-x^i)))\\ &=exp(\sum\limits_{i=1}^{n}a_i(-ln(1-x^i)))\\ &=exp(\sum\limits_{i=1}^{n}a_i\sum\limits_{j=1}^{\infty}\frac{(x^i)^j}{j})\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{1}{j}\sum\limits_{i=1}^{n}a_i(x^j)^i)\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{1}{j}A(x^j))\\ \end{aligned}\]

也就是说对于第\(j\)项,只需要累加\(j\)的倍数项。
那么复杂度是:

\[\sum\limits_{i=1}^{n}\frac{n}{i}=n\sum\limits_{i=1}^{n}\frac{1}{i}=nH_n=nln(n) \]

se.体积为\(i\)的物品有\(a_i\)种,每种有一个,求\([0,n]\)所有容积的方案。
设体积为\(i\)的物品的\(OGF\)\(F_i(x)\)
那么:

\[F_i(x)=1+x^i \]

设答案数组的\(OGF\)\(A(x)\)
那么:

\[\begin{aligned}\\ A(x)&=\prod\limits_{i=1}^{n}F_i^{a_i}(x)\\ &=\prod\limits_{i=1}^{n}(1+x^i)^{a_i}\\ &=exp(ln(\prod\limits_{i=1}^{n}(1+x^i)^{a_i}))\\ &=exp(\sum\limits_{i=1}^{n}a_iln(1+x^i))\\ &=exp(\sum\limits_{i=1}^{n}a_i\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}(x^i)^j}{j})\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}}{j}\sum\limits_{i=1}^{n}a_i(x^j)^i)\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}}{j}A(x^j))\\ \end{aligned}\]

一样是调和级数的复杂度。

posted @ 2019-12-12 19:38  Lrefrain  阅读(562)  评论(3编辑  收藏  举报