无标号无根树计数

一、题目

点此看题

二、解法

首先来介绍一下 \(\tt 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_i\ln(1-x^i) \]

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

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

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

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

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

\[\ln G(x)=\sum_{i=1}^n f_i\sum_{j=1}^\infty\frac{x^{ij}}{j} \]

\[\ln G(x)=\sum_{j=1}^\infty\frac{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))=\exp\sum_{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)=x\prod_{i=1}^\infty(\frac{1}{1-x^i})^{g_i} \]

\[g(x)=x\exp\sum_{t=1}^\infty\frac{g(x^j)}{j} \]

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

尝试使用牛顿迭代,设 \(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)\),那么有这样一个柿子:

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

\(\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(x))=\ln(\frac{g(x)}{x})-g(x)-\alpha \]

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

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

然后直接带入牛顿迭代:

\[g(x)=g_0(x)-\frac{\ln(\frac{g(x)}{x})-g(x)-\alpha}{\frac{1}{x}\cdot\frac{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(n\log n)\)但是常数有亿点大


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

\[g_n-\sum_{k\geq\frac{n}{2}+1}g_k\cdot g_{n-k} \]

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

没有代码啊

posted @ 2021-03-15 22:14  C202044zxy  阅读(288)  评论(0编辑  收藏  举报