一、题目
二、解法
首先来介绍一下 ( t 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}^inftyfrac{g(x^j)}{j}),假设我们已经求出了在模 (x^n) 意义下的 (g_0(x)),现在要求出模 (x^{2n}) 意义下的 (g(x)),那么有这样一个柿子:
设 (alpha=sum_{t=2}^inftyfrac{g(x^j)}{j}=sum_{t=2}^inftyfrac{g_0(x^j)}{j}),然后把 (f(g(x))) 换一下:
先把 (f'(g_0(x))) 算出来,可以用内求导( imes)外求导,要把里面的 (frac{1}{x}) 当成常数才行,(alpha) 也是常数:
然后直接带入牛顿迭代:
因为 (g_0) 没有常数项所以不能求逆元,设 (g_1(x)=frac{g_0(x)}{x}),还要略微变化一下:
然后就可以愉快地牛顿迭代了,时间复杂度 (O(nlog n)),但是常数有亿点大
最后考虑怎么从无标号有根树转到无标号无根树,可以使用容斥,用有根的方案减去根不是重心的方案数,根不是重心等价于有一个子树大小大于等于 (frac{n}{2}+1),那么枚举这个子树大小即可:
但是当 (n) 为偶数的时候可能会出现两个重心的情况,这时候只能统计一次,所以此时还要减掉 ({g_{n/2}choose 2})
没有代码啊