Burnside 引理与 Polya 定理

1 群论基础

1.1 群的定义

若集合 SS 上的二元运算 构成的代数结构 G(S,) 满足以下性质:

  • 封闭性:a,bS,abS
  • 结合律:a,b,cS,(ab)c=a(bc)S
  • 单位元:eS,aS,ea=ae=a
  • 逆元:aS,bS,ab=ba=e。称 ba 的逆元,记作 a1

则称 G(S,) 是一个

例:实数的乘法运算就是一个群。

还有一些关于群的其他定义:

  • 阿贝尔群:即交换群,满足交换律的群。
  • 半群:集合 SS 上的运算 构成的代数结构 (S,),满足封闭性和结合律。
  • 有限群:元素个数有限的群称为有限群,其元素个数称作有限群的,记作 |G|

1.2 子群及相关性质

1.2.1 子群相关概念

子群:对于一个群 G(S,),若 TS,且 H(T,) 也是一个群,我们称 HG 的子群,记作 HG

生成子群:对于 S 的一个非空子集 T,我们求出 G 的所有使 TT 的子群 (T,) 的交 G,则 G 称为 T 的生成子群,记作 T

循环群:仅由一个元素生成的群称作循环群。

陪集:对于群 G 的一个子群 H

  • 对于 aG,定义 H 的一个左陪集aH={ahhH}
  • 对于 aG,定义 H 的一个右陪集Ha={hahH}

1.2.2 陪集的性质

这里我们只讨论右陪集的性质,左陪集是同理的:

  • aG,|H|=|Ha|
  • aG,aHa
  • Ha=HaH。证明考虑用上两条性质即可。
  • Ha=Hbab1H。证明考虑用上一条性质即可。
  • HaHbHa=Hb。证明考虑用上一条性质即可。

然后由这些性质可以导出下面的定理:

  • HG,那么 |H| 整除 |G|,更准确的:

|G|=|H|×[G:H]

其中 [G:H] 表示 GH 不同的陪集(左右均可)数量。这就是拉格朗日定理

2 置换和置换群

2.1 置换

有限集合到自身的双射称为称为置换,不可重集 S={a1,a2,an} 上的置换可表示为:

f=(a1a2anap1ap2apn)

其中 p1pn[1,n] 的一个排列。显然 S 上的置换数量为 n!

定义两个置换 f,g 的乘法 fg=f(g(x)),也就是先经过 g 的置换再经过 f 的置换。

2.2 置换群

显然的,对于集合 S 上的所有置换关于置换乘法具有封闭性、结合律、有单位元(恒等置换)、有逆元(上下两行互相颠倒的两个置换)。所以它们构成了一个群。

我们通常将在 {1,2,,n} 上的所有置换构成的群称之为 n 元对称群,记作 Sn。这个群的任意一个子群称为置换群

2.3 循环置换

循环置换又称轮换,是一种特殊的置换,可以写作:

(a1,a2,,an)=(a1a2an1ana2a3ana1)

若两个置换中没有相同元素,则称两个置换不相交。有如下定理:

  • 每一个置换都可以分解成若干互不相交的轮换的乘积。例如 (123456265431)=(1,2,6)(3,5)

证明考虑将 aiapi 连边,则每个点入度出度均为一,因此形成的图必然是若干环的集合,而每一个环就是一个轮换。

3 轨道-稳定子定理

定义 A,B 是两个有限集合,X=BA 表示所有 AB 的映射,G 是作用在 A 上的一个置换群。

我们定义,对于每个 xX

Gx={gg(x)=x,gG}G(x)={g(x)gG}

Gxx稳定子G(x) 称作 x轨道

考虑两者的实际含义,稳定子的意义实际上是 G 中的某一个置换,满足置换前和置换后做映射 x 得到的结果不变。而轨道就是 G 中的所有置换后做映射 x 得到的结果。

例:给定一个 2×2 的矩形,对它进行黑白染色,求本质不同方案数(本质不同定义为无法通过旋转得到另一种方案)。

我们的群 G,也就是置换中的元素应该有顺时针旋转 0,90,180,270

对于 X 中的一个元素 x,即一种染色方案,例如 (1001),其稳定子集合就是顺时针旋转 0,180,其轨道集合就是 (1001),(0110)

然后我们就可以得到轨道-稳定子定理

|G|=|Gx|×|G(x)|

证明的话先考虑证明 GxG 的子群,由定义不难证出它满足群的四个定义。紧接着由拉格朗日定理可以得到 |G|=|Gx|×[G:Gx]。然后证明 [G:Gx]=|G(x)| 即可。

4 Burnside 引理

仍然沿用上一节中 A,B,X,G 的定义。我们定义若 X 的两个映射经过 G 中的置换后相等,则称两个映射在同一等价类中。

定义 X/G 表示 G 作用在 X 上产生的所有等价类的集合。而 |X/G| 称为轨道数(不难发现 X/G 就是不同轨道的集合),实际上就是 X 中本质不同的映射个数。

再定义 Xg={xg(x)=x,xX},称 XgX 在置换 g 下的不动点集合。也就是一个映射集合中经过置换 g 后不改变结果的映射个数。

则我们会有 Burnside 引理

|X/G|=1|G|gG|Xg|

例:仍然考虑上一节给出的染色问题。

我们最后要求的答案就是 |X/G|。当 g 取的是顺时针旋转 180 时,Xg 就是 (1001),(0110),(0000),(1111),所以 |Xg|=4

所以我们解决这个问题的关键就是求某一置换下不动点的数量。

证明的话可以使用轨道-稳定子定理,如下所示:

1|G|gG|Xg|=1|G|xX|Gx|=xX|Gx||G|=xX1|G(x)|=SX/GxS1|G(x)|=SX/GxS1|S|=SX/G1=|X/G|

值得注意的是上述结论在 XBA 的时候依然成立,也就是说及时给映射加上一些限制条件的话 Burnside 引理依然成立。

5 Polya 定理

Polya 定理实际上就是 Burnside 引理的一种特殊情况,其它内容与 Burnside 引理保持一致,形式变为:

|X/G|=1|G|gG|B|c(g)

其中 c(g) 表示置换 g 拆分出来的轮换数量。证明只需考虑 |B|c(g)=|Xg| 即可。上文提到过置换可以写成几个轮换的形式,那么如果要求 X 中的一个映射是关于 g 的不动点,那么每一个轮换的映射是一样的即可。每一个轮换有 |B| 种选择,所以 |Xg|=|B|c(g)

发现此时必须要求每一个映射都合法才行,也就是说 Polya 定理只有在 X=BA 时才成立,相比于 Burnside 引理限制要多,但是 c(g) 有时会比不动点数量好求,此时就应该使用 Polya 定理了。

6 例题

6.1 基础置换群相关

例 1 [POJ2369] Permutations

发现此题求的是给定一个置换,问多少次置换后可以从 1n 的序列变回来。我们不妨从轮换的角度考虑这个问题,将置换拆成几个轮换,显然只有当进行的次数是某个轮换的长度的倍数的时候,这个轮换中的数字才是有序的。那么为了让所有数字有序,只需要让进行的次数是所有轮换的长度的最小公倍数即可。

求轮换的过程很简单,相当于连边找环。代码如下:

#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] 物品调度

Link

发现题目中就是要求出 posi,只要求出 posi 之后我们就可以用置换相关的知识去求解了。

这个 posi=(ci+dxi+yi)modn 的式子看上去很新颖,我们考虑假如 yi 固定,实际上我们就是在不断加 di,这样的话我们最后能算出来的数字构成了一个长为 ngcd(n,d) 的环,排序后每两个数之间相差 gcd(n,d)

容易发现的是,以不同的数字作为起点,能够形成的环是互不相交的。这就告诉我们 yi 的作用在于确定环的编号,而 xi 的作用就是在环上找一个点作为答案。我们现在要找到编号 cimodgcd(n,d) 之后第一个还有数字可以选择的环,然后在环上找出 ci+yi 后面第一个可以选择的数,这个数就是 posi

暴力找环的复杂度过高,无法接受,考虑用并查集维护两个过程。如果一个点 x 被选择了,将它指向 (x+d)modn 的点;同理如果一个编号为 y 的环被选择完了,将它指向编号 (y+1)modgcd(n,d) 的环。

最后我们求出了 posi,现在将这个置换转成轮换的形式,如果轮换大小为 1 则不用累加;否则如果轮换中有 0 加上轮换长度减一,否则加上轮换长度加一。

例 3 [POJ3128] Leonardo's Notebook

我们要求这个置换能不能由两次置换得到。显然我们先考虑将它划分成几个轮换,然后接下来我们需要构造每个轮换怎样由一个置换做两次得到。

现在对于轮换 (a0,a1,an1),怎么写成置换 (b0,b1bn1) 做两次的结果。不难发现的是,做过两次置换后 ai 会变成 bbi,而理论上最后 ai 要变成 a(i+1)modn

n 是个奇数的时候,取 bi=a(i+(n+1)/2)modn,会有 bbi=a(bi+(n+1)/2)modn=a(i+n+1)modn=a(i+1)modn,故对于所有奇数长度的轮换,一定可以构造出由一个置换做两次得到。

然后发现当 n 为偶数的时候,我们难以构造出合适的 bi。此时我们发现对于任意一个长为偶数的 (b0,b1,bn1) 的轮换,其进行两次后一定会被分成两个长度相等的轮换。也就是说,我们分割出来的长为偶数的轮换 (a0,a1,an1),一定是一个长度为 2n 的轮换分裂出来的。

那么问题就简单了,既然偶数长度的轮换一定是分裂出来的,那么如果偶数长度的轮换无法两两配对即说明无解,否则必有一组解。

6.2 Burnside 引理与 Polya 定理相关

例 1 [HNOI2008] Cards

Link

题目中给出的所谓 “洗牌法” 已经把性质提示到眼前了,不难发现这 m 个洗牌法和恒等置换构成了一个置换群,所以我们可以用上面的两个定理。由于此题的映射不完整(要保证红、蓝、绿颜色个数是给定值),所以不能使用 Polya 定理,那么用 Burnside 引理即可。

我们现在要求的就是对于一个置换的不动点数量,仍然将置换展开成轮换,每个轮换内的颜色必须一致。我们采用类似背包的 dp,设 dp(i,j,k,l) 表示当前在第 i 个轮换,三种颜色个数分别为 j,k,l 的方案,简单 dp 之后套公式求解即可。

例 2 [JZOJ4800] 周末晚会

题意: 在一个环上放 MW 两种字母,W 不能连续放超过 k 个,问本质不同环的个数。

由于映射有限制,所以仍然考虑 Burnside 定理。现在先考虑置换怎样表示,我们可以认为是顺时针旋转 1n 个人,然后就要考虑置换下的不动点个数。对于旋转 d 个人,不动点的要求是每 gcd(n,d) 个人都是一样的,那么我们可以 dp,设 dp(i,0/1) 表示总共放了 i 个人,最后一个放的是男 / 女的方案数,然后进一步我们可以算出放 i 个人的方案数。

具体的,考虑先断环成链,枚举最开始放了几个女生,然后前缀和优化 dp,可以做到 O(nk)。累加答案后我们对于 sumi,枚举它的倍数 j,当 gcd(n,j)=i 的时候 sumi 都是置换旋转 j 次的不动点,所以加到不动点总和里,最后除以 n 就是答案。

例 3 【模板】Polya 定理

Link

我们发现此时对环染色不再有映射限制,所以可以考虑使用 Polya 定理了。置换仍然考虑旋转 1n 次,现在的问题就是求出 c(g)。同样不难发现,对于旋转 i 次的置换 g,其 c(g)=gcd(n,i)。所以答案即为:

1ni=1nngcd(i,n)

很显然我们需要进行一些处理,所以做如下变换:

1ni=1nngcd(i,n)=1ni=1ndind[gcd(n,i)=d]=dnnd1i=1n[gcd(n,i)=d]=dnnd1i=1nd[gcd(nd,i)=1]=dnnd1φ(nd)

现在问题是怎么求这个式子,看上去如果我们直接暴力求的话复杂度会爆炸,考虑到我们实际上的瓶颈在于求 φ 的复杂度,而这个复杂度就是 n 的所有因子的根号之和,即 σ0.5(n)。实际上它的上界是 O(n3/4) 的,所以总复杂度为 O(Tn3/4),实际上可以通过。具体证明可以看这个

例 4 [POJ2888] Magic Bracelet

前面的做法和例 2 基本一致,现在的问题是怎样求出不动点个数,即求出长度为 i 的合法手链个数。考虑设 dp(i,j) 表示第 i 个位置放 j 颜色手链的方案数,则转移方程为 dp(i,j)=(k,j) is legaldp(i1,k)

由于 n 过大,所以肯定无法直接转移。发现这个式子完全可以写成一个矩阵乘法的形式,所以我们可以矩阵快速幂优化 dp 进行求解。完了之后再枚举 i 的倍数 j,用同例 2 的方式统计答案即可。

时间复杂度是 O(n×m3logn) 的,前者是枚举因子 i,后者是矩阵快速幂优化 dp。

例 5 [HNOI2009] 图的同构 / [SHOI2006] 有色图

Link1Link2

容易发现的是,我们将边的存在与否看成两种颜色,那么第一题就是后一题中 m=2,p=997 的情况。在此我们只考虑后一种更普遍的情况。

题目中已经告诉了我们置换的内容,就是对点的编号进行置换。那么我们的映射就是点编号到边集颜色的一个映射,这看上去很奇怪,但是你可以理解为这里的映射是对边 (a1,a2),(a1,a3),(a1,an),,(an1,an) 的染色。

于是可以发现一点,虽然映射没有限制,但是这个问题中的 A,B 集合比较奇怪,无法直接使用 Polya 定理,不妨先用 Burnside 引理入手。假如给定了一个置换,现在我们要求出其中的不动点集合,也就是一种对边的染色方案使得其置换后不变。考虑分类讨论:

  • 假如该边连接的端点在同一个轮换内。由于轮换构成了一个环,所以这条边会在整个环上走一圈,那么这些边的颜色必须一致。
  • 假如该边连接的端点不在同一个轮换内。由于端点在两个轮换上,所以边的两个端点会在环上不断走,因此再回到原状态的时候应该走过了两个环长度 ai,ajlcm,这些边的颜色必须一致。

此时我们发现,这里面出现了和 Polya 定理类似的情况,即有一些边的颜色必须一致。假设这样的边集有 k 个,则不动点个数就是 mk,实际上转化为了 Polya 定理中的情况。考虑 k 的值,在第一种情况中,边的端点在环上不同的距离(取较小的)就对应不同的边集,所以有 ai2 个边集;在第二种情况中,这两个轮换之间共 aiaj 条连边,每一次有 lcm(ai,aj) 条边划分到一个边集中,所以共有 gcd(ai,aj) 个边集。

此时答案就是 1n!gGmk。暴力枚举时间复杂度 O(n!) 的,考虑优化。我们不再考虑每一个置换拆出来的轮换的贡献,相反,考虑每一种不同的 ai 序列(不考虑顺序)有多少个置换与之对应。先爆搜拆出 ai,然后利用组合数学算方案数。

具体的,我们要先将 n 划分成几个大小为 a1,a2,am 的集合,这个的方案数显然是 n!ai!。然后每一个集合内部的元素要放在一个环上排序,这个的方案数同样显然为 ai!ai=(ai1)!。最后还有一点,我们在选择集合的时候,对于 ai 相等的集合无需考虑其顺序,所以还要除以 ci!,其中 ci 为每种 a 的出现次数。

所以方案数的式子是 n!aici!。再乘上前面的部分就可以得到答案为:

mkaici!

暴力求出答案即可。复杂度就是爆搜的复杂度,n60 很小可以通过。

posted @   UKE_Automation  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示