P5818 [JSOI2011]同分异构体计数

题面

\(n\) 个点的无标号基环树的个数,满足:

  • 环的大小在 \(3\sim m\) 之间。
  • 每个点的度数 \(\le 4\)

数据范围:\(n\le 10^3,m\le 50\)

题解

记一下burnside在(基环)树上的用法。

首先注意到因为是基环树,所以可以认为是有根的(就是以环为根)。

\(f_i\) 表示大小为 \(i\) 的有根无标号树的方案数。

因为每个点的度数 \(\le 4\),所以有转移:

\[f_{n+1}=\sum_{i+j+k=n}f_if_jf_k \]

但是!这是无标号的树,也就是 相同大小的子树 之间是没有区别的,所以就需要去重。

怎么去重?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在树上和环上的用法。
posted @ 2022-07-25 15:18  qwq_123  阅读(35)  评论(0编辑  收藏  举报