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

    因为光讲知识不会套路是不行的这个。
    所以我要给你们讲套路的这个。

    1.遗忘的集合
    http://hzoj.com/contest/220/problem/2
    看起来是个构造题。
    啊但是啊。
    学了(OGF)啊,我给你讲了背包的套路。
    然后你就发现他是唯一方案了对吧。
    然后就推式子就行了。
    我们设答案的布尔数组为:$$A(x)=sumlimits_{i=1}^{n}a_ix^i$$
    这里的(a_iin[0,1])
    (f(n))(OGF)(F(x)=sumlimits_{i=1}^{n}f(i)x^i)
    所以,套上完全背包的板子推式子就完事了。

    [egin{aligned}\ F(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}\ ln(F(x))&=ln(prodlimits_{i=1}^{n}(frac{1}{1-x^i})^{a_i})\ &=sumlimits_{i=1}^{n}a_i(0-ln(1-x^i))\ &=-sumlimits_{i=1}^{n}a_iln(1-x^i)\ &=-sumlimits_{i=1}^{n}a_i(-sumlimits_{j=1}^{infty}frac{(x^i)^j}{j})\ &=sumlimits_{i=1}^{n}a_isumlimits_{j=1}^{infty}frac{(x^i)^j}{j}\ r&=ij\ &=sumlimits_{r=1}^{infty}x^rsumlimits_{i|r}a_ifrac{i}{r}\ end{aligned}]

    这样我们对(F(x))求一个(ln)就可以得到:

    [egin{aligned}\ [x^r]F(x)=sumlimits_{i|r}a_ifrac{i}{r}\ r[x^r]F(x)=sumlimits_{i|r}a_ii\ end{aligned}]

    (g(n)=n[x^n]F(x),h(n)=na_n)
    那么:

    [g(n)=sumlimits_{d|n}h(d) ]

    莫比乌斯反演得到:

    [h(n)=sumlimits_{d|n}mu(frac{n}{d})g(d) ]

    [a_n=frac{h(n)}{n} ]

    直接输出就可以了。
    哦忘记了。
    是任意模数。
    打个(MTT)吧。

    2.生成树计数
    http://hzoj.com/contest/220/problem/3

    首先可以用(prufer)序列统计答案。
    设一个联通块在(prufer)序列中出现的次数为(d_i)
    那么答案可以表示为:

    [egin{aligned}\ ans&=sumlimits_{T}(prodlimits_{i=1}^{n}(d_i+1)^m)(sumlimits_{i=1}^{n}(d_i+1)^m)\ &=sumlimits_{T}(n-2)!(prodlimits_{i=1}^{n}frac{a_i^{d_i+1}(d_i+1)^m}{d_i!})(sumlimits_{i=1}^{n}(d_i+1)^m)\ &=(n-2)!prodlimits_{i=1}^{n}a_isumlimits_{T}prodlimits_{i=1}^{n}frac{a_i^{d_i}(d_i+1)^m}{d_i!}sumlimits_{i=1}^{n}(d_i+1)^m\ &=(n-2)!prodlimits_{i=1}^{n}a_isumlimits_{T}sumlimits_{i=1}^{n}frac{a_i^{d_i}(d_i+1)^{2m}}{d_i!}prodlimits_{j=1,j!=i}frac{a_j^{d_j}(d_j+1)^m}{d_j!}\ A(x)&=sumlimits_{i=0}^{n}frac{(i+1)^{2m}}{i!}x^i\ B(x)&=sumlimits_{i=0}^{n}frac{(i+1)^{m}}{i!}x^i\ ans&=(n-2)!prodlimits_{i=1}^{n}a_i[x^{n-2}]sumlimits_{i=1}^{n}A(a_ix)prodlimits_{j=1,j!=i}^{n}B(a_jx)\ &=(n-2)!prodlimits_{i=1}^{n}a_i[x^{n-2}]sumlimits_{i=1}^{n}frac{A(a_ix)}{B(a_ix)}prodlimits_{j=1}^{n}B(a_jx)\ &=(n-2)!prodlimits_{i=1}^{n}a_i[x^{n-2}]sumlimits_{i=1}^{n}frac{A}{B}(a_ix)exp(ln(prodlimits_{j=1}^{n}B(a_jx)))\ &=(n-2)!prodlimits_{i=1}^{n}a_i[x^{n-2}]sumlimits_{i=1}^{n}frac{A}{B}(a_ix)exp(sumlimits_{j=1}^{n}ln(B(a_jx)))\ end{aligned}]

    我们需要求一个数列(g(j))

    [g(j)=sumlimits_{i=1}^{n}a_i^j ]

    这样我们把(g(j))和求出的(frac{A}{B},ln(B))对位相乘就可以直接得到:

    [sumlimits_{i=1}^{n}frac{A}{B}(a_ix),sumlimits_{i=1}^{n}ln(B(a_ix)) ]

    现在考虑如何求(g(j))
    求数列的前(k)次方和,这是个套路(奇迹银桥)。
    设其生成函数为(G(x)=sumlimits_{i=0}^{infty}g(i)x^i)
    那么:

    [egin{aligned}\ G(x)&=sumlimits_{i=0}^{infty}sumlimits_{j=1}^{n}a_j^ix^i\ &=sumlimits_{j=1}^{n}sumlimits_{i=0}^{infty}(a_jx)^i\ &=sumlimits_{j=1}^{n}frac{1}{1-a_jx}\ end{aligned}]

    [(ln(1-a_ix))'=frac{-a_i}{1-a_ix}=-sumlimits_{j=0}^{infty}(a_ix)^ja_i ]

    [egin{aligned} F(x)&=sumlimits_{i=1}^{n}(ln(1-a_ix))'\ &=-sumlimits_{i=1}^{n}sumlimits_{j=0}^{infty}(a_ix)^ja_i\ &=-sumlimits_{j=0}^{infty}x^jsumlimits_{i=1}^{n}(a_i)^{j+1}\ end{aligned} ]

    这样有:

    [G(x)=-xF(x)+n ]

    如果我们可以快速的求出(F(x))就好了。
    (F(x))既然是我造出来的我肯定会求对吧。

    [F(x)=sumlimits_{i=1}^{n}(ln(1-a_ix))'=(sumlimits_{i=1}^{n}ln(1-a_ix))'=(ln(prodlimits_{i=1}^{n}1-a_ix))' ]

    好了可以直接分治(FFT)了。

    3.Or
    http://hzoj.com/contest/133/problem/3
    题意就是要求(A)数列后面一项必然要出现一个之前从未出现过的(1)
    (dp[i][j])为前(i)个数,有(j)位已经出现过了(1)的方案数。
    那么:

    [dp[i][j]=sumlimits_{k=1}^{j}dp[i-1][j-k]inom{j}{k}2^{j-k} ]

    拆一下式子,找指数生成函数的影子。

    [frac{dp[i][j]}{j!}=sumlimits_{k=1}^{j}frac{dp[i-1][j-k]2^{j-k}}{(j-k)!}frac{1}{k!} ]

    (F_i(x))(dp[i])的生成函数。

    [F_i(x)=sumlimits_{j=0}^{infty}frac{dp[i][j]x^j}{j!} ]

    所以:

    [F_i(x)=F_{i-1}(2x)(e^x-1) ]

    写成迭代式:

    [F_n(x)=prodlimits_{i=0}^{n-1}e^{2^ix}-1 ]

    这时候题解的方式显得麻烦。我们已经学会多项式全家桶了。

    [egin{aligned}\ F_n(x)+n&=prodlimits_{i=0}^{n-1}e^{2^ix}\ &=exp(ln(prodlimits_{i=0}^{n-1}e^{2^ix}))\ &=exp(sumlimits_{i=0}^{n-1}2^ix)\ end{aligned}]

    直接把系数加起来然后(exp)回去就行了。
    这样就可以得到(dp[n][i])了。
    直接统计答案即可。
    Upd:最后一题算法假了。

  • 相关阅读:
    深入浅出TCP之listen
    indexing and hashing
    c++四种强制类型转化
    c++实现web服务框架
    MVC、MVP、MVVM概念解析
    常用设计模式
    [React]虚拟DOM
    防抖和节流
    函数柯里化
    apply, bind, call方法剖析
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12031466.html
Copyright © 2011-2022 走看看