• 【清华集训2017】 生成树计数


    • 题目链接

      luoguP4002

      uoj#335

      loj#2320

    • 题意

      见题面

    • 题解

      • 前置知识

        \(prufer\)序列

        关于生成树的计数问题,我们又一个工具叫\(prufer\)序列,简单来说每一个生成树都与一个\(prufer\)序列一一对应,并且每一个点在\(prufer\)序中的出现次数为度数\(-1\),这是最重要的性质,跟\(prufer\)序的构造方式有关,详细请自行学习。

      • 根据\(prufer\)序,我们可以写出\(ans\)的式子:

        \[ans=\sum \frac{(n-2)!}{\prod d_i!}\left(\prod_i (di+1)^m a^{d_i+1}\right)\left(\sum_i (di+1)^m\right) \]

        这个式子很不好求,我们将一些定量提出来,并将\(\frac{1}{\prod d_i!}\)放到里面,再推一推式子,就能化成:

        \[ans=(n-2)!\prod a_i \sum \left(\sum_i\frac{(d_i+1)^{2m}}{d_i!}a_i^{d_i} \prod_{j\neq i} \frac{(d_j+1)^m}{d_i!} a_j^{d_i}\right) \]

        这时我们可以大胆猜测利用多项式,但发现\(a_i^{d_i}\)很不好搞,但是这个在多项式内和第\(i\)项的\(x\)的幂是一样的,可以合并,所以设

        \[A(x)=\sum_i \frac{(i+1)^{2m}}{i!}x^i\\ B(x)=\sum_i \frac{(i+1)^{m}}{i!}x^i \]

        那么

        \[ans=(n-2)!\prod a_i \sum \left(\sum_i A(a_ix)\prod_{j\neq i} B(a_jx)\right) \]

        将后面的连乘补全

        \[ans=(n-2)!\prod a_i\sum\left(\sum_i \frac{A(a_ix)}{B(a_ix)}\right)\left(\prod_iB(a_jx)\right) \]

        所以我们要求的就是后面的式子。

        求和可以直接做,连乘先\(ln\)\(exp\)也能做。但是因为每一项都都带了一个\(a_i\),所以我们现在的问题就是在求出\(\frac{A}{B}\)\(\prod B\)后怎么把\(a_i\)变成系数。

        设其中一个函数为\(F\),第\(i\)次项系数为\(f_i\),所以

        \[\sum_iF(a_ix)=\sum_i\sum_jf_ja_i^jx^j=\sum_if_i\left(\sum_j a_j^i\right)x^i \]

        那么我们考虑对于每一个\(k\),求出\(\sum_i a_i^k\)

        这有一个简单的方法,令这个的生成函数为\(G\),那么

        \[G(x)=\sum_i\sum_j a_i^jx^j=\sum_i\frac{1}{1-a_ix} \]

        求和不好做,但是如果是求积就可以分治\(fft\),所以将求和转为求积,考虑\(ln\),因为有分式,所以考虑\(ln\)后的求导。

        那么很自然想到

        \[(\ln(1-a_ix))'=-\frac{a_i}{1-a_ix}=\frac{1}{x}\left(1-\frac{1}{1-a_ix}\right) \]

        那么

        \[\frac{1}{1-a_ix}=1-x(\ln(1-a_ix))' \]

        所以

        \[G(x)=\sum_i\frac{1}{1-a_ix}=n-x\sum_i(\ln(1-a_ix))'=n-x\ln\left(\prod_i(1-a_ix)\right)' \]

        这样就可以直接分治\(fft\),总复杂度\(O(nlog^2n)\),瓶颈在两个分治\(fft\)其他的常数也挺大的

  • 相关阅读:
    Oracle误删除数据和表的恢复办法包括truncate
    SQL中简单函数介绍
    SQL中的null
    oracle数据库实例后台进程
    常用查询视图
    AIX 常用命令积累(未完待续)
    查询当前用户下的表/查询某一个用户的表
    查询统计运行和采控库里所有用户下的记录数大于5000万条的表
    使用orace数据库自带的sqldeveloper
    PL/SQL Developer
  • 原文地址:https://www.cnblogs.com/leukocyte/p/13406854.html
Copyright © 2020-2023  润新知