写在前面
之前写过一个辣鸡,以为会板子就好了,结果在ABC284H中寄了。所以决定重写个完整的。
参考文章
概念性的东西
群论研究的是对称性,为了方便描述,我们举个例子。
比如对于一个正方形而言,可以发现我们把它顺时针旋转 90∘ 后,可以发现它和原来相同,同理,旋转 180∘,270∘,0∘ 也相等(不考虑超过 360∘ 的旋转)。
因此为了叙述正方形旋转的对称性,我们定义一个群,及 S={旋转0∘,旋转90∘,旋转180∘,旋转270∘}。
但是这还不够,注意到这些操作是可以叠加的,比如旋转 90∘ 后再旋转 180∘,那么相当于旋转 270∘,那么这个叠加运算需要定义一下,姑且称其为 + 吧。
那么 (S,+),就构成了正方形旋转的一个群。
举完了个简单的例子,再来说明形式化的定义:
若一个非空集合 S 上的运算 × 满足以下条件,那么称 (S,×) 是一个群。
- 封闭性:∀a,b∈S,a×b∈S。比如上面的例子中,无论这个群中的变换怎样叠加,一定还在这个集合中。
- 结合律: ∀a,b,c∈S,(a×b)×c=a×(b×c),运算顺序无影响。
- 存在单位元:∃e∈S,∀a∈S,a×e=e×a=a,上面的例子中,旋转0∘ 就是单位元。
- 存在逆元:∀a∈S,∃b∈S,a×b=b×a=e,b 是 a 的逆元,也可以表示为 a−1。
可以通过上面的例子,发现群内的元素一般来说都是某种操作,而不是简单的元素。
其他定义:
- 阿贝尔群:满足交换律的群,也就是 ∀a,b∈S,a×b=b×a。
- 半群:(S,×) 只满足封闭性和结合律。
- 幺半群:半群的基础上还存在单位元。
- 有限群:元素个数有限的群。注意群的个数可以无限,比如圆的旋转,转任意度都和原来一样。
举一些例子:
- (R,+) 和 (R,×) 都是无限群。
- (R,max) 是半群,不存在单位元和逆元。但是 (N,max) 是幺半群,单位元是 0。
一些简单性质
反证法,假设有两个单位元 a,b,a≠b,那么 a=a×b=b。
假设有两个逆元 a,b,那么 a=a×(x×b)=b。
子群与陪集
子群:对于一个群 (S,×),如果存在一个 T⊆S 且 (T,×) 是一个群,(T,×) 就是 (S,×) 的子群,可以记为 T≤S。
陪集:
- 如果 H≤S,对于一个 a∈G,定义 H 的一个左陪集为 aH={a×h,h∈H}。
- 如果 H≤S,对于一个 a∈G,定义 H 的一个右陪集为 Ha={h×a,h∈H}。
陪集可能不是一个群,因为可能没有单位元。
陪集的一些性质:
- ∀a∈S,|H|=|Ha|。
只需要证明陪集中元素两两不同,反证一下即可。
因为 H 中一定有单位元。
Ha=Hb 可以推出 Hab−1=H。
- Ha∩Hb≠∅,Ha=Hb。
也就是两个陪集要么相等,要么完全不交。
证明可以简单反证。
拉格朗日定理
如果 H≤S,那么 |H| 整除 |S|,也就是:
|S|=|H|×[S:H]
此处 [S:H] 表示 H 不同的陪集数量。
证明:不同的陪集两两不交,且大小相等。
周期相关
对于一个元素 a∈S,定义周期 o(a)=min{x|ax=e,x∈N+},这里 ax=ax−1×a。
因为是个子群,拉格朗日定理即可。
置换群
有限集合自身的双射称为置换。
简单的表示为 (p1,p2,p3,...,pn),p 是一个排列,这个置换作用在 a 上表示 f(ai)=api。
置换的总个数为 n!。
那么定义一下两个置换的运算,假设有 f=(p1,p2,...,pn),g=(q1,q2,...,qn)。
那么 f×g=(pq1,pq2,...,pqn),也就是先做 g 再做 f。
显然,这样所有长度为 n 的置换构成了一个群,称为 n 元对称群 Sn,这个群的任意一个子群被称为置换群。
置换群的单位元是 I=(1,2,3,...,n)。
轨道-稳定子定理
A,B 是两个有限集合,令 X=BA 表示 A 到 B 的全部映射,G 是作用在 A 上的一个群。
比如给一个正方形的四条边染色,那么 A 就是四条边,B 就是颜色集合,G 就表示令四条边等价的置换群,X 就表示所有染色方案(不去重)。
对于一个 x∈X,也就是一种染色方案,定义 g(x) 表示对 x 进行 g 置换后的结果。
-
稳定子:Gx={g|g(x)=x,g∈G},即置换后和原来相等。
-
轨道:G(x)={g(x)|g∈G},注意此处 |G(x)|≠G,因为可能有 g(x) 相同。
-
轨道-稳定子定理:
|G|=|Gx|×|G(x)|
证明,先考虑 Gx 是 G 的子群。
- 封闭性:g(x)=x,f(x)=x,g(f(x))=g(x)=x。
- 结合律:显然满足。
- 单位元:I(x)=x。
- 逆元:f(x)=x,x=f−1(x),f−1∈Gx。
用拉格朗日定理,接下来只需要证明 [G:Gx]=|G(x)|。
这个考虑对轨道里每一个元素求一个陪集 aGx。容易证明他们两两不交即可。
Burnside 引理
令 X/G 表示在 X(所有染色方案中),在 G 作用下的所有等价类的集合(如果两种方案通过 G 中置换的作用下相等,则它们在一个等价类中),也就是对于所有 x∈X,轨道的数量。
|X/G|=1|G|∑g∈G|Xg|
这里,Xg={x|g(x)=x,x∈X},也就是 g 作用下 不动点集合。
证明:
|X/G|=∑y∈X/G1=∑y∈X/G∑x∈y1|y|=∑y∈X/G∑x∈y1|G(x)|
这里用一下轨道-稳定子定理。
=1|G|∑y∈X/G∑x∈y|Gx|=1|G|∑x∈X|Gx|
此时考虑每个置换的贡献,就可以得到:
=1|G|∑g∈G|Xg|
Pólya 定理
考虑在染色问题中,如果每个点都可以任意染色,也就是 |X|=|B||A|,那么 g(x)=x 可以发现对于 g 的每一个置换环都需要然一种颜色,因此令 c(g) 表示 g 的置换环数量,m=|B|,可以得到:
|X/G|=1|G|∑g∈Gmc(g)
做题记录
P4980
给定一个 n 个点,n 条边的环,有 n 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 109+7 取模。
注意本题的本质不同,定义为:只需要不能通过旋转与别的染色方案相同。
n≤109,t≤103。
直接用 Pólya 即可,G 中每个元素都是形如 (i+1,i+2,...,n,1,2,...,i) 这样的排列,|G|=n,它的置换环数量显然就是 、gcd(n,i)。
|X/G|=1|G|∑g∈Gmc(g)=1nn∑i=1ngcd(n,i)=1n∑d|nndn∑i=1[gcd(i,n)=d]=1n∑d|nndφ(nd)
大力求即可,复杂度 tn34。
code
P4128
已知 n 个点的无向完全图,给每条边染色,一共 m 种颜色,两种染色方案相同仅当将点编号置换后对应边颜色相同,求方案数。
n≤60。
无向图的计数问题是群论的一个重要应用。
由于是给所有边进行染色,但是置换是对于点的,所以需要把置换改成对于边的操作。
即对于置换 (p1,p2,...,pn),相当于 p(i,j)=(pi,pj) 这个置换,相当于求这个的置换环数量。
考虑对于一种方案,求其置换环数量。
先考虑原排列 p 的置换环,假设大小分别为 a1,a2,...,ak。
对于所有边,相当于两个端点在置换环上分别走,那么分类讨论一下。
-
如果两端点在同一个置换环内,那么考虑两端点在环上的距离 x,每个距离对应着一个置换环,而且 x 与 ai−x 等价,所以数量为 ⌊ai2⌋
-
如果两端点不在一个置换环内,从一条边出发走 lcm(ai,aj) 次后会走回来,所以置换环数量为 aiajlcm=gcd(ai,aj)。
加起来就好了,假设是 f(p)。
那么答案就是
|X/G|=1|G|∑g∈GXg=1n!∑p∈Snmf(p)
暴力求复杂度 O(n!),寄。
但是注意到对于每个排列,如果其置换环大小集合 a 相同,则它们等价,因此可以直接分拆数去求,可以通过 n=60,此时总分拆方案数是 966467。
code
双倍经验:P4727
相当于 m=2,p=997。
三倍经验:ABC284Ex。
在图计数的基础上加了个点染色。
那么只需要在式子后面乘一个点染色方案数,因为点和边独立。
|X/G|=1|G|∑g∈GXg=1n!∑p∈Snmg(p)2f(p)
g(p) 表示 p 的置换环数量。
但是求的是恰好用 k 种颜色,只需要容斥一下,暴力跑 k 遍 dfs 即可。
但是太慢了,由于发现上面的 g(p)≤n,可以一次 dfs 求出 mi 前面乘的系数,这样就只需要一次 dfs,可以跑 n≤60 了。
loj6519
先直接上公式,相当于求 |Xg|。
注意到这个环上的排列很有特征,对于 Pi=(i+1,i+2,...,n,1,2,...,i) 而言,|Xg| 中的染色方案满足存在长度为 ngcd(n,i) 的周期。
每个周期的黑色点数量相同,问题转化为子问题,也就是去掉了环等价的限制。
连续 k 个黑比较难搞,转化一下就是两个白之间距离不能超过 k,这个可以插板了。
先枚举最左和最右用了多少,然后中间的大力容斥即可。
k∑d=0(d+1)n−m∑i=0(−1)i(n−mi)(m−d+n−m−2−i(k+1)n−m−2)
注意到第二个循环只需要枚举到 mk+1 即可,因此总复杂度 mk×k=m,可过。
code
实现里没有用莫比乌斯反演,因为暴力就行了。
一开始以为这个过不去,怒推生成函数。
[xm](1+x+x2+...+xk)n−m−1(1+2x+3x2+...+(k+1)xk)=[xm](1−xk+11−x)n−m−11−xk+11−x−(k+1)xk+11−x=[xm](1−xk+1)n−m(1−x)n−m+1−(k+1)[xm−k−1](1−xk+1)n−m−1(1−x)n−m
问题相当于只需要求解
[xa](1−xk+1)b(1−x)c=[xa](1−xk+1)b∑(c−1+ii)xi
只需要枚举左边选了几个,那么右边的就可以直接算了,所以这部分可以 O(min(b,ak+1)),所以综上,这部分复杂度就变成了 O(mk)。
code
确实快了一些。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具