无标号无根树计数
一、题目
二、解法
首先来介绍一下 \(\tt Euler\) 变换,一个比较新鲜的前置知识。
定义 \(F(x)\) 的欧拉变换为:
有一个很明显的组合意义是 \(F(x)\) 为 \(n\) 个点满足某种条件的连通图数量,\(\mathcal E(F(x))\) 为 \(n\) 个点满足某种条件的图的数量,也相当于每一种物品有 \(f_i\) 种选法,而且可以任意多个的方案数。
欧拉变换还有另一个更有用的导出柿子,但是需要我们来推一推,首先我们看到求乘积可以尝试去对数,设 \(G(x)=\mathcal E(F(x))\):
利用 \(\ln'(x)=x\) 的性质,我们对上面的柿子两边对 \(x\) 求导:
把 \(\frac{1}{1-x^i}\) 这东西做闭形式展开,那么:
然后积分回去(其实就是求导的逆变换):
第一个柿子是定义式,通常用欧拉变换都用导出柿子。
回到本题,无标号无根树不是很好算,我们先考虑能不能算有标号有根树,再通过一些神奇的操作把答案算出来。设 \(g_n\) 为大小为 \(n\) 的无标号有根树的数量,那么我们枚举根是什么,再枚举它的子树:
使用欧拉变换,写成生成函数的形式:
尝试使用牛顿迭代,设 \(f(g(x))=\ln(\frac{g(x)}{x})-\sum_{t=1}^\infty\frac{g(x^j)}{j}\),假设我们已经求出了在模 \(x^n\) 意义下的 \(g_0(x)\),现在要求出模 \(x^{2n}\) 意义下的 \(g(x)\),那么有这样一个柿子:
设 \(\alpha=\sum_{t=2}^\infty\frac{g(x^j)}{j}=\sum_{t=2}^\infty\frac{g_0(x^j)}{j}\),然后把 \(f(g(x))\) 换一下:
先把 \(f'(g_0(x))\) 算出来,可以用内求导\(\times\)外求导,要把里面的 \(\frac{1}{x}\) 当成常数才行,\(\alpha\) 也是常数:
然后直接带入牛顿迭代:
因为 \(g_0\) 没有常数项所以不能求逆元,设 \(g_1(x)=\frac{g_0(x)}{x}\),还要略微变化一下:
然后就可以愉快地牛顿迭代了,时间复杂度 \(O(n\log n)\),但是常数有亿点大
最后考虑怎么从无标号有根树转到无标号无根树,可以使用容斥,用有根的方案减去根不是重心的方案数,根不是重心等价于有一个子树大小大于等于 \(\frac{n}{2}+1\),那么枚举这个子树大小即可:
但是当 \(n\) 为偶数的时候可能会出现两个重心的情况,这时候只能统计一次,所以此时还要减掉 \({g_{n/2}\choose 2}\)
没有代码啊