Burnside of 等价类计数 笔记
对于 Burnside 引理的推导和群论知识,可参考云浅大佬的博客,这篇笔记主要为便利以后复习回顾。
等价类计数
某些计数中,我们会定义一种等价,比如矩阵染色,将矩阵旋转后与另一个矩阵相同,那么就认为这两个矩阵是等价的,要求我们求出两两不等价的矩阵的个数。
这类问题中,我们把等价的定义转化为一个置换群 \(G\),假设两个状态 \(a,b \in S\),且存在置换 \(f \in G\),使得 \(f(a) = b\),那么 \(a\) 和 \(b\) 等价。求解方法可以通过找每个置换存在的置换环个数,只要能找到这个,我们就可以在 \(O(|G|)\)(忽略快速幂等)的时间复杂度内求解问题。推一推式子就可以继续优化(数论统治世界)。
Burnside 引理
我们设 \(D(g)\) 表示在 \(g \in G\) 这个置换下有多少状态保持不变。那么
详细推导请看云浅大佬的博客😋。
Polya 定理
知道了 Burnside 引理之后,Polya 定理无非是进一步推导罢了。
在 Burnside 引理中,我们定义了 \(D\),但 \(D\) 并不好求。因此我们进一步考虑,假设考虑某一个置换 \(g \in G\),我们通过置换关系画图,会发现很多置换环,如果两个状态想要等价,那么同一个置换环里面的东西就要相同。就像上面举的矩阵染色问题,假设矩阵大小是 \(2 \times 2\),并且我们考虑旋转 \(180°\),这时候同一个对角上的两个方格形成一个置换环,那么如果两个状态等价,两个状态的对角上的方格就得相同。
现在定义 \(c(g)\) 是在置换 \(g \in G\) 中置换环的个数,那么可以简单的得出
\(m\) 是由题目定义的,比如上文提到的染色问题,\(m\) 就是可以染的颜色个数。
实际上,写题时直接考虑 \(Burnside\) 就行了,其他的通过题目灵活变通。
题目
P4980 【模板】Polya 定理
置换群 \(G\) 是每次将序列整体旋转 \(\{ 0,1,2,\cdots,n-1 \}\) 次。可以发现旋转 \(x\) 次这个置换所形成的置换环是 \(\gcd(n,x)\) 个,\(x=0\) 可以看作 \(x=n\)。因为形成一个置换环意味着从一个点出发经过 \(t\) 次向前连长度为 \(x\) 的边后第一次把边连回自己身上,那么 \(t \times x\) 是 \(n\) 和 \(x\) 的最大公倍数,\(t\) 是置换环的长度,那么置换环的数量为 \(\frac n t = \gcd(n,x)\)。
所以答案就是 \(\displaystyle \sum_{i = 1}^n m^{\gcd(n,i)}\),通过变换求和顺序得到答案是 \(\displaystyle \sum_{d | n} \varphi(d) \times m^d\)。
至此,直接直接暴力求解就行了。
P1446 [HNOI2008] Cards
置换群很显然,题目直接输入,难点在于对于每个置换如何算出 \(D(g)\)。
我们将一个置换环看作一个物品,这个物品可以被涂成 RGB 颜色中的一种,同时会占用 \(c(x)\) 的空间,也就是说有 \(c(g)\) 个物品都是这个颜色了。(\(c(x)\) 表示 \(x\) 这个置换环的长度)
至此,我们可以用三维 dp 并在 \(O(1)\) 的复杂度内转移,这样就算出了每一个 \(D(g)\)。问题解决,复杂度是四次方级别的。
P4128 [SHOI2006] 有色图
哪里有涩图,我认识个大佬想要
首先关注到重构条件是一种置换,但是不容易找置换环,所以抛弃 polya,burnside 硬推统治世界!
我们有四种连边,一一讨论:
-
点与点连边:直接连,没有别的限制。
-
环与点连边:如果一个环上的一个点连了另一个点,那么这个环上的所有点都要和那个点相连。
-
环与环连边:可以手动模拟一下,假设有环 \(A,B\),\(a_1\) 连了 \(b_1\),那么 \(a_2\) 就要连 \(b_2\),回环往复,直到 \(a_x\) 和 \(b_y\) 即将连接,却发现他们俩已经连过了。容易发现这样的边要连 \(lcm(|A|,|B|)\) 条,因为 \(A\) 和 \(B\) 之间一共有 \(|A||B|\) 条边,所以一共有 \(\frac {|A||B|} {lcm(|A|,|B|)} = \gcd(|A|,|B|)\) 种边集合可以让两个环之间连接。
-
环内部连边:模拟一下就可以发现环内部有 \(\frac {|A|} 2\) 种边集合可以让环内部连接。
前三条其实可以合并,直接取 gcd。所以,如果给定一个置换,那么找到所有的置换环之后,可以得出 \(D(g)\),并且 \(D(g)\) 一定是 \(m\) 的次方。
现在考虑 \(n\) 的拆分数,将 \(n\) 个数拆成很多置换环的形式,然后算出来这些置换环之间产生的 \(D(g)\)。现在的任务是算出来有多少种置换可以形成这样的置换环组合。
首先把每一个元素都分配在这些置换环里面,也就是 typical 多重组合数,假设这些置换环的长度放进数组 \(a\) 里,那么答案就是 \(\frac {n!} {\prod a_i!}\)。
同时发现,很多元素虽然在一个环里面,但是这些元素以什么样的连边形成一个环,是有很多情况的,所以要乘上 \(\prod (a_i - 1)!\)。
然后,因为如果有多个置换环的长度相同,那么他们之间的顺序是没有意义的。设 \(b_i\) 表示某一个长度的置换环出现了多少次,答案要除以 \(\prod b_i!\)。总结下来,最后有 \(res\) 个置换会形成当前枚举的置换环组合,那么

浙公网安备 33010602011771号