Burnside 引理与 Polya 定理
1 群论基础
1.1 群的定义
若集合
- 封闭性:
。 - 结合律:
。 - 单位元:
。 - 逆元:
。称 为 的逆元,记作 。
则称
例:实数的乘法运算就是一个群。
还有一些关于群的其他定义:
- 阿贝尔群:即交换群,满足交换律的群。
- 半群:集合
和 上的运算 构成的代数结构 ,满足封闭性和结合律。 - 有限群:元素个数有限的群称为有限群,其元素个数称作有限群的阶,记作
。
1.2 子群及相关性质
1.2.1 子群相关概念
子群:对于一个群
生成子群:对于
循环群:仅由一个元素生成的群称作循环群。
陪集:对于群
- 对于
,定义 的一个左陪集为 。 - 对于
,定义 的一个右陪集为 。
1.2.2 陪集的性质
这里我们只讨论右陪集的性质,左陪集是同理的:
。 。 。证明考虑用上两条性质即可。 。证明考虑用上一条性质即可。 。证明考虑用上一条性质即可。
然后由这些性质可以导出下面的定理:
- 若
,那么 整除 ,更准确的:
其中
2 置换和置换群
2.1 置换
有限集合到自身的双射称为称为置换,不可重集
其中
定义两个置换
2.2 置换群
显然的,对于集合
我们通常将在
2.3 循环置换
循环置换又称轮换,是一种特殊的置换,可以写作:
若两个置换中没有相同元素,则称两个置换不相交。有如下定理:
- 每一个置换都可以分解成若干互不相交的轮换的乘积。例如
。
证明考虑将
3 轨道-稳定子定理
定义
我们定义,对于每个
称
考虑两者的实际含义,稳定子的意义实际上是
例:给定一个
的矩形,对它进行黑白染色,求本质不同方案数(本质不同定义为无法通过旋转得到另一种方案)。 我们的群
,也就是置换中的元素应该有顺时针旋转 。 对于
中的一个元素 ,即一种染色方案,例如 ,其稳定子集合就是顺时针旋转 ,其轨道集合就是 。
然后我们就可以得到轨道-稳定子定理:
证明的话先考虑证明
4 Burnside 引理
仍然沿用上一节中
定义
再定义
则我们会有 Burnside 引理:
例:仍然考虑上一节给出的染色问题。
我们最后要求的答案就是
。当 取的是顺时针旋转 时, 就是 ,所以 。 所以我们解决这个问题的关键就是求某一置换下不动点的数量。
证明的话可以使用轨道-稳定子定理,如下所示:
值得注意的是上述结论在
5 Polya 定理
Polya 定理实际上就是 Burnside 引理的一种特殊情况,其它内容与 Burnside 引理保持一致,形式变为:
其中
发现此时必须要求每一个映射都合法才行,也就是说 Polya 定理只有在
6 例题
6.1 基础置换群相关
例 1 [POJ2369] Permutations
发现此题求的是给定一个置换,问多少次置换后可以从
求轮换的过程很简单,相当于连边找环。代码如下:
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2e5 + 5;
const int Inf = 2e9;
int n, a[Maxn];
int len[Maxn], vis[Maxn];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
int tot = 0;
for(int i = 1; i <= n; i++) {
if(vis[i]) continue;//已经在环上了
tot++;
int pos = i;
while(!vis[pos]) {//找环
len[tot]++;
vis[pos] = 1;
pos = a[pos];
}
}
int ans = 1;
for(int i = 1; i <= tot; i++) {
ans = ans * len[i] / __gcd(ans, len[i]);
}
cout << ans << '\n';
return 0;
}
例 2 [HNOI2010] 物品调度
发现题目中就是要求出
这个
容易发现的是,以不同的数字作为起点,能够形成的环是互不相交的。这就告诉我们
暴力找环的复杂度过高,无法接受,考虑用并查集维护两个过程。如果一个点
最后我们求出了
例 3 [POJ3128] Leonardo's Notebook
我们要求这个置换能不能由两次置换得到。显然我们先考虑将它划分成几个轮换,然后接下来我们需要构造每个轮换怎样由一个置换做两次得到。
现在对于轮换
当
然后发现当
那么问题就简单了,既然偶数长度的轮换一定是分裂出来的,那么如果偶数长度的轮换无法两两配对即说明无解,否则必有一组解。
6.2 Burnside 引理与 Polya 定理相关
例 1 [HNOI2008] Cards
题目中给出的所谓 “洗牌法” 已经把性质提示到眼前了,不难发现这
我们现在要求的就是对于一个置换的不动点数量,仍然将置换展开成轮换,每个轮换内的颜色必须一致。我们采用类似背包的 dp,设
例 2 [JZOJ4800] 周末晚会
题意: 在一个环上放 M
,W
两种字母,W
不能连续放超过
由于映射有限制,所以仍然考虑 Burnside 定理。现在先考虑置换怎样表示,我们可以认为是顺时针旋转
具体的,考虑先断环成链,枚举最开始放了几个女生,然后前缀和优化 dp,可以做到
例 3 【模板】Polya 定理
我们发现此时对环染色不再有映射限制,所以可以考虑使用 Polya 定理了。置换仍然考虑旋转
很显然我们需要进行一些处理,所以做如下变换:
现在问题是怎么求这个式子,看上去如果我们直接暴力求的话复杂度会爆炸,考虑到我们实际上的瓶颈在于求
例 4 [POJ2888] Magic Bracelet
前面的做法和例 2 基本一致,现在的问题是怎样求出不动点个数,即求出长度为
由于
时间复杂度是
例 5 [HNOI2009] 图的同构 / [SHOI2006] 有色图
容易发现的是,我们将边的存在与否看成两种颜色,那么第一题就是后一题中
题目中已经告诉了我们置换的内容,就是对点的编号进行置换。那么我们的映射就是点编号到边集颜色的一个映射,这看上去很奇怪,但是你可以理解为这里的映射是对边
于是可以发现一点,虽然映射没有限制,但是这个问题中的
- 假如该边连接的端点在同一个轮换内。由于轮换构成了一个环,所以这条边会在整个环上走一圈,那么这些边的颜色必须一致。
- 假如该边连接的端点不在同一个轮换内。由于端点在两个轮换上,所以边的两个端点会在环上不断走,因此再回到原状态的时候应该走过了两个环长度
的 ,这些边的颜色必须一致。
此时我们发现,这里面出现了和 Polya 定理类似的情况,即有一些边的颜色必须一致。假设这样的边集有
此时答案就是
具体的,我们要先将
所以方案数的式子是
暴力求出答案即可。复杂度就是爆搜的复杂度,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律