P5818 [JSOI2011]同分异构体计数
题面
求 \(n\) 个点的无标号基环树的个数,满足:
- 环的大小在 \(3\sim m\) 之间。
- 每个点的度数 \(\le 4\) 。
数据范围:\(n\le 10^3,m\le 50\) 。
题解
记一下burnside
在(基环)树上的用法。
首先注意到因为是基环树,所以可以认为是有根的(就是以环为根)。
设 \(f_i\) 表示大小为 \(i\) 的有根无标号树的方案数。
因为每个点的度数 \(\le 4\),所以有转移:
但是!这是无标号的树,也就是 相同大小的子树 之间是没有区别的,所以就需要去重。
怎么去重?burnside
!
考虑子树的置换是什么,好像是 \(3\) 的全排列。
那么就考虑会成环的个数:
- \(3\) 个环,方案数只有一种:\((1,2,3)\) 。
转移就是 \(f_{n+1}\leftarrow\sum_{i+j+k=n}f_if_jf_k\) 。
- \(2\) 个环,方案数有三种:\((1,3,2),(3,2,1),(2,1,3)\) 。
那么我们就认为其中的两个子树要一样,那么转移就是 \(f_{n+1}\leftarrow3\sum_{2i+j=n}f_if_j\)
- \(1\) 个环,方案数有两种:\((2,3,1),(3,1,2)\)。
那么我们就认为三个子树都要一样,那么转移就是 \(f_{n+1}\leftarrow 2f_{\frac{3}{n}}\) 。
直接做是 \(n^3\) 的,但我们可以计 \(g_i=\sum_{i+j=n}f_if_j\) ,然后就可以做到 \(n^2\) (其实就是把原本的 \(f_{3,n}\) 化成了 \(f_n\) 和 \(g_n\))
现在挂在环周围的有根树可以做了,但是环上的我们还不会。
同样的,直接设 \(g_{i,j}\) 为 \(i\) 个环上点和 \(j\) 个环外点然后转移也是会重的,这时候我们就考虑一下有几种置换:
- 旋转环,对应了:\((1+x,2+x,...,(n-1+x)\bmod n+1)\) 。
这个就比较常规了,直接用 \(\gcd\) 相关的解决就行。
-
对称环。
-
环长是奇数,此时就有一个对称点是自己对称自己,其余的都两两对应了。
那么答案就是 \(m\sum_{i+i\le n}g_{\frac{m-1}{2},i}\cdot f_{n-i-i}\) 。
-
环长是偶数,那么就有 \(\frac{m}{2}\) 次是两个点自己对称自己,\(\frac{m}{2}\) 次是全部两两对应。
同样可以得到答案。
-
启发
burnside
在树上和环上的用法。