zoukankan      html  css  js  c++  java
  • 「总结」多项式生成函数相关(3)

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

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

    [F(x)=sumlimits_{i=0}^{infty}a_ix^i ]

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

    [F(x)=sumlimits_{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}=sumlimits_{j=0}^{i}a_j ]

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

    [A(x)=sumlimits_{i=0}^{n}x^i ]

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

    [inom{i+k-1}{k-1} ]

    那么也就是说:

    [A^k(x)=sumlimits_{i=0}^{n}inom{k+i-1}{k-1}x^i ]

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

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

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

    比如(1)(EGF)为:

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

    同样是一个级数求和。
    相比之下(EGF)用来解决排列问题。
    比如说这样一个问题:
    (A)中拿出任意多个相同物品,从(B)中拿出任意多个相同物品,如果认为拿出来的物品的顺序不同视为不同方案,求拿出的物品个数为(i)的方案数。
    (EGF)为:$$G(x)=sumlimits_{i=0}^{infty}frac{x^i}{i!}$$
    设答案数组的(EGF)为:$$R(x)=sumlimits_{i=0}^{infty}frac{res_i}{i!}x^i$$
    那么:

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

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

    [frac{n!}{prodlimits_{i=1}^{w}a_i!} ]

    这样我们再来观察这个卷积的过程。
    相当于是把相同的物品的系数乘了一个(frac{1}{i!})
    而最后的系数的和下面除了一个(i!),相当于可重集合上面乘的(n!)

    大概,可以懂吧?

    例:http://hzoj.com/contest/126/problem/10
    在大神们都用分治发发塔(AC)之后,我们再次看一下这道题能否有低于(nlog^2n)的复杂度。
    (n)个点无向图的个数为(g(n)=2^{inom{n}{2}}),设(n)个点联通图的个数为(f(n))
    列出式子:

    [g(n)=sumlimits_{i=1}^{n}inom{n-1}{i-1}f(i)g(n-i) ]

    拆一下:

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

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

    (G_0(x)=sumlimits_{i=0}^{n}frac{g(i+1)}{i!}x^i),(G_1(x)=sumlimits_{i=0}^{n}frac{g(i)}{i!}x^i),(F(x)=sumlimits_{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)=sumlimits_{i=0}^{infty}P(X=i)x^i ]

    那么:

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

    也就是说:

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

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

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

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

    [egin{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)=sumlimits_{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^{inom{n}{2}})(n)个点有标号无向图。
    (f(n))(EGF)为:

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

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

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

    [G(x)=sumlimits_{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))
    那么由于有无限个。
    首先复习两个级数求和公式:

    [sumlimits_{i=0}^{infty}x^j=frac{1}{1-x} ]

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

    所以:

    [F(x)=sumlimits_{i=0}^{infty}(x^i)^j ]

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

    [egin{aligned}\ A(x)&=prodlimits_{i=1}^{n}F_i^{a_i}(x)\ &=prodlimits_{i=1}^{n}(sumlimits_{i=0}^{infty}(x^i)^j)^{a_i}\ &=prodlimits_{i=1}^{n}(frac{1}{1-x^i})^{a_i}\ &=exp(ln(prodlimits_{i=1}^{n}(frac{1}{1-x^i})^{a_i}))\ &=exp(sumlimits_{i=1}^{n}a_i(0-ln(1-x^i)))\ &=exp(sumlimits_{i=1}^{n}a_i(-ln(1-x^i)))\ &=exp(sumlimits_{i=1}^{n}a_isumlimits_{j=1}^{infty}frac{(x^i)^j}{j})\ &=exp(sumlimits_{j=1}^{infty}frac{1}{j}sumlimits_{i=1}^{n}a_i(x^j)^i)\ &=exp(sumlimits_{j=1}^{infty}frac{1}{j}A(x^j))\ end{aligned}]

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

    [sumlimits_{i=1}^{n}frac{n}{i}=nsumlimits_{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))
    那么:

    [egin{aligned}\ A(x)&=prodlimits_{i=1}^{n}F_i^{a_i}(x)\ &=prodlimits_{i=1}^{n}(1+x^i)^{a_i}\ &=exp(ln(prodlimits_{i=1}^{n}(1+x^i)^{a_i}))\ &=exp(sumlimits_{i=1}^{n}a_iln(1+x^i))\ &=exp(sumlimits_{i=1}^{n}a_isumlimits_{j=1}^{infty}frac{(-1)^{j-1}(x^i)^j}{j})\ &=exp(sumlimits_{j=1}^{infty}frac{(-1)^{j-1}}{j}sumlimits_{i=1}^{n}a_i(x^j)^i)\ &=exp(sumlimits_{j=1}^{infty}frac{(-1)^{j-1}}{j}A(x^j))\ end{aligned}]

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

  • 相关阅读:
    学习dubbo
    【Spring】SpringMVC配置文件
    Mac下git配置
    【Spring】入门HelloWorld
    【MySql】启动/停止
    Javaweb 编解码流程
    TensorFlow学习笔记1
    Nginx 代理配置
    【转】RPC介绍
    【dubbo】dubbo控制台搭建
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12030726.html
Copyright © 2011-2022 走看看