相当于计算度数不超过4的无标号无根树个数。按照无根树的套路,我们直接枚举子树即可。
但是无根树可以用exp来搞,这个度数有限制。
我们可以换一种方法,显然子树每个点度数不超过3,记其生成函数为 A A A,可以用Polya定义来计数:
首先假设儿子彼此有序,然后规定如果某个置换之后得到两个等价的东西,那么这两个算一个方案。 我们枚举每一个置换,利用Burnside引理,容易得到:
A = 1 + x 2 A ( x 3 ) + 3 A ( x 2 ) A ( x ) + A ( x ) 3 6 A=1+x\frac{2A(x^3)+3A(x^2)A(x)+A(x)^3}{6} A=1+x62A(x3)+3A(x2)A(x)+A(x)3
相当于每种置换的每个循环节内部必须严格相等。 枚举环然后系数就是这样的置换的个数,利用分治FFT在 O ( n log 2 n ) O(n\log^2n) O(nlog2n)时间内预处理。
然后用经典的枚举重心的儿子的方法,就可以在 O ( n log n ) O(n \log n ) O(nlogn)的时间内解决单组询问。
考虑如何解决多组询问,我们发现,对于任意一棵无根树,我们记其点的等价类为 p p p个,边的等价类有 q q q个,对称边(两边的点等价)有 s s s个,那么有$s\le 1 , 且 ,且 ,且p-q+s=1$。
证明如下:
如果有对称边,那么显然 p − q = 0 → p − q + s = 1 p-q=0 \rightarrow p-q+s=1 p−q=0→p−q+s=1。
否则等价点不会为重心,重心等价类只有1个点,重心一定在其路径上,他们的父亲是等价边。 我们可以得到 p − q = 1 p-q=1 p−q=1 (加上重心)。
然后求出 ∑ p , ∑ q , ∑ s \sum p , \sum q , \sum s ∑p,∑q,∑s即可。
∑ p \sum p ∑p相当于有根树计数,是4个儿子拼起来,同理用Polya可得:
P ( x ) = x 6 A ( x 4 ) + 6 A ( x 2 ) A 2 ( x ) + 3 A 2 ( x 2 ) + 8 A ( x 3 ) A ( x ) + A ( x 4 ) 24 P(x)=x\frac{6A(x^4)+6A(x^2)A^2(x)+3A^2(x^2)+8A(x^3)A(x)+A(x^4)}{24} P(x)=x24