首先考虑假如是树上的做法:
考虑dp,f(i)表示对i的子树染色的方案数。
用hash可以实现查询两棵子树是否相同。
从而根据hash值排序分类,将相同的子树放在一类. (1)
f(i)等于每一类的f(p)乘起来除以此类大小size的阶乘。(2)
从而O(nlogn)求出了环周围的树的答案
然后考虑用群论求环上的答案。
等价于有tot个珠子(环上的点),每个珠子有一个颜色(子树的形状),我们说旋转x格是此问题的置换群之一,***当且仅当旋转x格后各个珠子的颜色与相应位置的要求依然吻合***。(3)
求旋转那些格数之后可以吻合可以用KMP匹配判断。
旋转x格后的不动点个数为$$\prod_{i=1}^{(tot,i)} f[p(i)]$$
(因为当子树形状相同时,必然有对应f值相同)
预处理前缀乘积,用Bunside公式计算答案即可。