• 无标号无根树计数


    一、题目

    点此看题

    二、解法

    首先来介绍一下 ( t Euler) 变换,一个比较新鲜的前置知识。

    定义 (F(x)) 的欧拉变换为:

    [mathcal E(F(x))=prod_{i=1}^n(frac{1}{1-x^i})^{f_i} ]

    有一个很明显的组合意义是 (F(x))(n) 个点满足某种条件的连通图数量,(mathcal E(F(x)))(n) 个点满足某种条件的图的数量,也相当于每一种物品有 (f_i) 种选法,而且可以任意多个的方案数。

    欧拉变换还有另一个更有用的导出柿子,但是需要我们来推一推,首先我们看到求乘积可以尝试去对数,设 (G(x)=mathcal E(F(x)))

    [ln G(x)=-sum_{i=1}^nf_iln(1-x^i) ]

    利用 (ln'(x)=x) 的性质,我们对上面的柿子两边对 (x) 求导:

    [frac{G'(x)}{G(x)}=sum_{i=1}^nf_ifrac{ix^{i-1}}{1-x^i} ]

    (frac{1}{1-x^i}) 这东西做闭形式展开,那么:

    [frac{G'(x)}{G(x)}=sum_{i=1}^n f_isum_{j=0}^infty ix^{(j+1)i-1} ]

    然后积分回去(其实就是求导的逆变换):

    [ln G(x)=sum_{i=1}^n f_isum_{j=1}^inftyfrac{x^{ij}}{j} ]

    [ln G(x)=sum_{j=1}^inftyfrac{1}{j}sum_{i=1}^nf_i(x^j)^i ]

    [ln G(x)=sum_{j=1}^infty frac{F(x^j)}{j} ]

    [mathcal E(F(x))=expsum_{j=1}^infty frac{F(x^j)}{j} ]

    第一个柿子是定义式,通常用欧拉变换都用导出柿子。


    回到本题,无标号无根树不是很好算,我们先考虑能不能算有标号有根树,再通过一些神奇的操作把答案算出来。设 (g_n) 为大小为 (n) 的无标号有根树的数量,那么我们枚举根是什么,再枚举它的子树:

    [g_n=[x^{n-1}]prod_{i=1}^infty (frac{1}{1-x^i})^{g_i} ]

    使用欧拉变换,写成生成函数的形式:

    [g(x)=xprod_{i=1}^infty(frac{1}{1-x^i})^{g_i} ]

    [g(x)=xexpsum_{t=1}^inftyfrac{g(x^j)}{j} ]

    [ln(frac{g(x)}{x})=sum_{t=1}^inftyfrac{g(x^j)}{j} ]

    尝试使用牛顿迭代,设 (f(g(x))=ln(frac{g(x)}{x})-sum_{t=1}^inftyfrac{g(x^j)}{j}),假设我们已经求出了在模 (x^n) 意义下的 (g_0(x)),现在要求出模 (x^{2n}) 意义下的 (g(x)),那么有这样一个柿子:

    [g(x)=g_0(x)-frac{f(g_0(x))}{f'(g_0(x))}mod x^{2n} ]

    (alpha=sum_{t=2}^inftyfrac{g(x^j)}{j}=sum_{t=2}^inftyfrac{g_0(x^j)}{j}),然后把 (f(g(x))) 换一下:

    [f(g(x))=ln(frac{g(x)}{x})-g(x)-alpha ]

    先把 (f'(g_0(x))) 算出来,可以用内求导( imes)外求导,要把里面的 (frac{1}{x}) 当成常数才行,(alpha) 也是常数:

    [f'(g_0(x))=frac{1}{x}cdotfrac{x}{g_0(x)}-1 ]

    然后直接带入牛顿迭代:

    [g(x)=g_0(x)-frac{ln(frac{g(x)}{x})-g(x)-alpha}{frac{1}{x}cdotfrac{x}{g_0(x)}-1}mod x^{2n} ]

    因为 (g_0) 没有常数项所以不能求逆元,设 (g_1(x)=frac{g_0(x)}{x}),还要略微变化一下:

    [frac{g(x)}{x}=g_1(x)-frac{ln(frac{g(x)}{x})-g(x)-alpha}{frac{1}{g_1(x)}-x}mod x^{2n} ]

    然后就可以愉快地牛顿迭代了,时间复杂度 (O(nlog n))但是常数有亿点大


    最后考虑怎么从无标号有根树转到无标号无根树,可以使用容斥,用有根的方案减去根不是重心的方案数,根不是重心等价于有一个子树大小大于等于 (frac{n}{2}+1),那么枚举这个子树大小即可:

    [g_n-sum_{kgeqfrac{n}{2}+1}g_kcdot g_{n-k} ]

    但是当 (n) 为偶数的时候可能会出现两个重心的情况,这时候只能统计一次,所以此时还要减掉 ({g_{n/2}choose 2})

    没有代码啊

  • 相关阅读:
    4章 关键的“构建”决策
    [转]EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
    5章 软件构建中的设计
    网站收集,慢慢积攒
    常见的SQL优化建议
    eclipse 最全快捷键 分享快乐与便捷
    设置Activity全屏和无标题
    Anaroid WebView详解大全
    cordova2.2对于CordovaWebView的配置
    在Android的webview中定制js的alert,confirm和prompt对话框的方法
  • 原文地址:https://www.cnblogs.com/C202044zxy/p/14540362.html
Copyright © 2020-2023  润新知