一.群
1.群的定义
对于一个集合 S 和定义在这个集合上的二元运算 ∗ , 满足:
-
封闭性。 ∀a∈S,b∈S ,a∗b∈S
-
结合律。 a∗b∗c=a∗(b∗c)
-
单位元。 ∃ϵ∈S , a∗ϵ=ϵ∗a=a
-
逆元。 ∀a∈S , ∃b∈S , a∗b=ϵ , 记作 a′
那么称 (S,∗) 为一个群。
值得注意的是,一个群的单位元和逆元都是唯一的。
2.子群
若 G(S,∗) 为一个群,若 T⊆S ,且 H(T,∗) 也为一个群,那么称 H 为 G 的子群,记作 H≤G
3.陪集
左陪集:若群 H 为群 G 的一个子群,且对于 g∈S,g∗H={g∗h|h∈T}。
同样可以定义右陪集。
注意陪集可能不包含单位元,不一定是群。
陪集的性质:
- |H|=|gH|
- g∈gH
- gH=H⇔g∈H
- aH=bH⇔a∗b−1∈H
- aH≠BH⇒aH⋂bH=∅
- ⋃g∈GgH=G
二.拉格朗日定理
[G:H]: G 中 H 不同陪集的数量
G / H : G 中所有 H 的左陪集
有:
|H|×[G:H]=|G|
证明:由陪集的性质 1、5、6 显然。
三.置换群
1.置换
对于集合 S={a1,a2…an} , 一个置换 f 可表示为:
f=(a1,a2,…,anap1,ap2,…,apn)
p 为 1∼n 的排列,意义为将 ai 映射为 api。
f=(ap1,ap2,…,apnaq1,aq2,…,aqn),g=(a1,a2,…,anap1,ap2,…,apn)
g×f=f(g(x))=(a1,a2,…,anaq1,aq2,…,aqn)
称为置换的乘法。
2.循环置换
一种特殊的置换,其中:
f=(a1,a2,…,an)=(a1,a2,…,ana2,a3,…,a1)
任意一个置换都可以表示为若干不相交的循环置换的乘积,例如
(a1,a2,a3,a4,a5a3,a1,a2,a5,a4)=(a1,a3,a2)×(a4,a5)
将一个置换 f 拆分的循环置换个数记为 c(f)
3.置换群
若 S 包含所有的 n! 个不同 n 元置换,G(S,×) 为一个群,证明如下:
- 封闭性。 两个 n 元置换的乘积仍为 n 元置换,包含于 S。
- 结合律。置换的乘法有结合律。
- 单位元。置换 (a1,a2,…,ana1,a2,…,an),也称恒等置换。
- 逆元。上下两行交换即可。
G 的子群称作置换群。
四.Burnsied 引理 和 Pólya 定理
1.轨道稳定子定理
对于作用在集合 X 上的群 G 和集合 X 的一个元素 x
x 的轨道:G(x)={g(x)|g∈G}
x 的稳定子:Gx={g∈G|g(x)=x}
这里 g(x) 为群作用的函数,例如上文提到的置换。
- Gx 为 G 的子群。
证明:
- 封闭性。 f(x)=x,g(x)=x,f×g=f(g(x))=x,所以 f×g∈Gx
- 结合律。显然。
- 单位元。ϵ(x)=x,所以 ϵ∈Gx
- 逆元。∀g∈G,因为 g×g′=ϵ , g(x)=ϵ(x)=x,所以 g′(x)=x,g′(x)∈G
- |G(x)|=[G:Gx]
证明:
对于 f(x)=g(x) , f×g−1=ϵ
所以 f×g−1∈Gx , ⇒fGx=gGx , 反之亦然。
即不同的 g 对应不同的陪集。
所以对于 G(x) 中的 g , 构造对应陪集为 gGx。
轨道稳定子定理:
|G(x)|×|Gx|=|G|
证明:
因为 Gx 为 G 的子群,由拉格朗日定理得:
|Gx|×[G:Gx]=|G|
由性质2得:
|Gx|×|G(x)|=|G|
2.Burnside 引理
若一个置换群 G 作用于 X , X/G 表示在群 G 作用下 X 的所有等价类的集合。(注意每个等价类也是一个集合,若两个元素在 G 作用下可以转化则属于同一个等价类)
Xg 表示在 g 的作用下不变的 X 中元素的集合。
那么有:
|X/G|=1|G|∑g∈G|Xg|
证明:
∑g∈G|Xg|=∑x∈X|Gx|=∑x∈X|G||G(x)|=|G|∑x∈X1|G(x)|=|G|∑Y∈X/G∑x∈Y1|G(x)|=|G|∑Y∈X/G∑x∈Y1|Y|=|G|∑Y∈X/G1=|G||X/G|
即:
|X/G|=1|G|∑g∈G|Xg|
可以参考 oi-wiki 的例子。
3.Pólya 定理
|X/G|=1|G|∑g∈Gmc(g)
证明:
由 burnside 引理发现,在 g 作用下的不动点的充要条件是每一个循环置换里元素同色。
那么式子就很显然了。
五.例题
首先置换群 G 包含的元素分别为: 旋转 1 个点,旋转 2 个点...旋转 n 个点
不难发现,旋转 k 个点的 c(g)=gcd(n,k),原因如下:
所有循环置换所包含的元素个数相同,均为 lcm(n,k)k。(旋转次数/旋转步长)
那么循环置换的个数便为 nlcm(n,k)k=gcd(n,k)
由 polya 定理得:
|X/G|=1nn∑i=1ngcd(i,n)
化简可得:
|X/G|=1n∑d|nndφ(nd)
直接计算即可,复杂度 O(n34)
与 例1 区别在于部分颜色无法相邻,解决这类有限制的问题一般使用 Burnside 引理。
记 fi 为有 i 个轮换的不动点数,由 1 得:
Ans=1n∑d|nφ(nd)f(d)
注意到同一个轮换里的点仍需同色,且不同轮换的点恰好相邻
设 gv,i,j 表示第 1 个点颜色为 v , 第 i 个点颜色为 j 的方案数
gv,i,j=∑k,颜色j,k可以相邻gv,i−1,k
fd=m∑i=1∑j,颜色i,j可以相邻gi,d,j
g 可以通过矩阵快速幂求得。
将转置看成一种置换,矩阵内的数一定形成若干轮换。
只需进行 k−1 次对换便可还原一个长度为 k 的轮换,换句话说,每有一个轮换答案便少 1。
令 K 为轮换数,答案便为 2a+b−K
考虑如何计算 K:
观察 a=2,b=1 的情况
前:
0(000) |
1(001) |
2(010) |
3(011) |
4(100) |
5(101) |
6(110) |
7(111) |
后:
0(000) |
4(100) |
1(001) |
5(101) |
2(010) |
6(110) |
3(011) |
7(111) |
发现转置后矩阵内数的二进制循环右移了 b 位,那么应该有 gcd(a+b,b)=gcd(a,b) 个轮换,每个轮换长度为 a+bgcd(a,b)
将每相邻的 gcd(a,b) 个二进制位看成一个整体,它的颜色应有 2gcd(a,b) 种 (每位有 0/1 两种选法)
令 n=a+bgcd(a,b) ,即新的’珠子‘个数。现在可以随便旋转,根据例 1 得
K=1n∑d|nφ(nd)(2gcd(a,b))d
筛出 φ 后枚举因数计算, 时间复杂度 O(t√n)
作用在点集的置换有 n! 种,考虑这些点置换对应的边的置换。
不妨将点置换分解为 k 个轮换,大小分别为 b1…bk
对于任意一条边 (i,j) , 记 li/lj 为 i/j 所在轮换的长度。
-
i,j 在同一轮换
轮换数量为 ⌊li2⌋
-
i,j 在不同轮换
轮换长度为 lcm(li,lj)
轮换数量为 gcd(li,lj)
所以得到边的轮换数:
f(b)=k∑i=1⌊bi2⌋+∑1≤i<j≤kgcd(bi,bj)
对于相同的 b ,不动点的数量总是一定的。
b 的数量为 n 的整数拆分数,可以直接枚举,只需计算对应 b 的置换数即可
通过多重集的排列划分方案得到每一个轮换的元素,方案为 n!∏bi!
通过钦定每个轮换第一个元素保证分解唯一,方案为 (bi−1)!
答案即为:
1n!∑bmf(b)n!∏bicnti!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现