群论学习笔记

1. 定义

群是一个二元组 \((G,\cdot)\) 其中,G 是集合,\(\cdot\) 是运算

运算要满足:

  1. 封闭性,即 \(a\cdot b=c,c\in G\)

  2. 满足结合律,即 \(a\cdot (b\cdot c)=(a\cdot b)\cdot c\)

  3. 有单位元,存在一个元素 \(e\),满足对于任意\(a\in G\) 满足 \(a\cdot e=e\cdot a=a\),则 \(e\) 是单位元

  4. 任意元素都有逆元,即对于任意 \(a\in G\),存在 \(a\cdot b=e\),则 b 为 a 逆元

子群:\((G,\cdot)\)\((H,\cdot)\),满足 \(\cdot\) 是同种运算且满足 H 是 G 的子集,则 \((H,\cdot)\)\((G,\cdot)\) 的子群

阶:就是元素个数,记为 \(|G|\)

2. 置换群

置换:就是一个 1-n 的排列到另一个 1-n 的排列的映射

\((1,2,3,4)\)\((2,4,1,3)\)

就是用 2 代替 1,用 4 代替 2,以此类推

\((2,3,4,1)\) 会变成 \((4,1,3,2)\)

置换群:

置换群 \((G,\cdot)\) 的元素就是 1-n 的排列的置换

两个置换的 \(\cdot\) 运算就是将两个置换合成,设 \(a,b\in G,a\cdot b=c\)

那么对于一个排列 x,进行一次 a 置换得到 \(a(x)\),再进行一次 b 置换得到 \(b(a(x))\)

那么 c 置换就是只用一次操作得到这个结果

它符合上面的要求,如下:

  1. 经过运算后后还是置换,显然封闭

  2. 根据定义,一次运算得到的就是将参与这两个运算的置换一次做完,所以存在结合律

  3. 单位元显然是 1-n 按顺序排列

  4. 经过两次置换达到单位元,只需要在第一次执行完后把值换回单位元即可,因为数字不重复,一定存在逆元

[poj2369]Permutations

https://www.gxyzoj.com/d/gxyznoi/p/37

其实可以将这个点的编号和对应的数字相连,这样每次置换后就相当于在环上走一步

所以只需要求出所有环的长度,求 lcm 即可

[USACO07FEB] Cow Sorting G

https://www.gxyzoj.com/d/gxyznoi/p/P38

同上一个题,只有在一个环上的会互相交换

所以每一次只需要让所有值与环上最小的交换,必然可以经过 len-1 次全部归位

但是如果最小值很大,就可以把这个序列的最小值换过来

注意,因为这里只是不重复,所以要离散化

[HNOI2010] 物品调度

https://www.gxyzoj.com/d/gxyznoi/p/P41

首先,假设我们已经知道这个目标位置,那么每一个不包含 s 且长度不为 1 的环就需要 len+1 步,包含 s 的环的贡献就是 len-1

接下来考虑如何找到目标点

首先,可以发现当 y 固定的时候,随着 x 的增加,就会在一个环上走

这样的环共有 \(gcd(d,n)\) 个,长度为 \(\frac{n}{gcd(n,d)}\)

因为先要让 y 尽量小,就近找没有满的环,可以使用并查集

接下来是 x,同理,但是用完后 \(f_p\) 要指向 \(f_{p+d}\) 并且记录 siz

[poj3128]Leonardo's Notebook

https://www.gxyzoj.com/d/gxyznoi/p/39

就是判断这个能不能通过一个置换群经过两次运算得到

注意到,如果一个偶环,经过两次置换,就会变成两个长度相等的环,而奇环不变

所以只需统计看每个长度的偶环个数是否是偶数即可

3.Burnside 引理

这个东西的适用范围就是同种染色置换能构成群

  • 有一个环,共 n 个节点,用 n 种颜色染,有多少种本质不同的方法?(这里的本质不同指无法通过旋转得到)

首先,我们可以定义一个同种染色置换群 \((G,\cdot)\),其中共有 n 个置换(元素)

显然,\(g_i\cdot g_j=g_{(i+j) mod\ n}\) 有封闭性

单位元就是 1-n 的顺序排列

如果我们不考虑旋转的问题,那么方案数就是 \(n^n\),这里可以让数字和每一种染色方案进行映射

记置换 \(g\in G\) 对编号为 k 的染色的作用为 g(k),那么 g(k) 必然和 k 是本质相同的,但是两者不一定完全一样

接下来构造一个函数 \(\forall g\in G,x\in\{1,2,\cdots,n^n\},f(g,x)=[g(x)=x]\)

\(h(g_i)=\sum_{k=1}^{n^n} f(g_i,k)\)

那么答案就是 \(\frac{1}{|G|}\sum_{i=1}^{|G|} h(g_i)\),证明如下

对于任意方案 k,必然存在置换 \(g\in G,g(k)=k\),将这些 g 组成一个新的集合,叫不动点集,就是另一个群,记为 \((Z_k,\cdot)\)

将 G 中的元素分别作用于 k,会得到 k 的等价类,记为 \(E_k\),则 \(E_k=\{g_1(k),g_2(k),\dots,g_{|G|}(k)\}\)

注意,\(E_k\) 中会存在相同的数,要剔除

假设 \(E=\{k1,k2,\dots,km\}\),必然存在 \(E=E_{k1}=E_{k2}=\cdots=E_{km}\)

所以求有多少本质不同的方案,就是求有多少等价类

\(Z_k=\{gi_1,gi_2,\dots,gi_p\},E_k=\{gj_1(k),gj_2(k),\dots,gj_q(k)\}\)

\(H=\{g|g=gi_x\cdot gj_y,1\le x\le p,1\le y\le q\}\),根据前面的操作,H中元素必然两两不同

\(\forall g\in G\),存在 \(g(k)\in E_k\)

\(g(k)=gj_y(k)\),则 \(gj_{y}^{-1}(g(k))=k\),所以 \(gj_y^{-1}\cdot g\in Z_k\)

所以 \(gj_y^{-1}\cdot g=gi_x\),必然存在 \(g=gi_x\cdot gj_y\in H\)

所以 \(|H|\ge |G|\),显然易证 \(|G|\ge |H|\)

所以对于 \(1-n^n\) 中的任何一个数,都存在 \(|G|=|Z_k|*|E_k|\)

所以对于一个等价类 \(E=\{k1,k2,\dots,km\}\),有 \(\sum_{i=1}^m |Z_{ki}|=|G|\)

\[\begin{aligned}\sum_{i=1}^{|G|} h(g_i) &= \sum_{i=1}^{|G|}\sum_{x=1}^{n^n}f(g_i,x)\\ &=\sum_{x=1}^{n^n}\sum_{i=1}^{|G|}f(g_i,x)\\ &= \sum_{i=1}^{n^n}|Z_x|\\ &= ans\cdot |G|\end{aligned} \]

回归原本的问题,关键在于如何求 \(h(g_i)\)\(g_i\) 就是经过 i 次置换

这个东西显然如果要相等,那么对应位置上的数一定相同,共有 \(gcd(i,n)\) 组对应位置

所以,\(ans=\frac{1}{n}\sum_{n=1}^{n} n^{gcd(i,n)}\)

[HNOI2008]Cards

https://www.gxyzoj.com/d/gxyznoi/p/P42

首先观察题目给的条件,显然满足结合律,有封闭性和逆元,但是没有单位元

所以可以加入恒等置换,此时题目中的东西构成群

回顾一下定理内容,就是求出每个置换的不动点数,也就是将每个环的颜色染相同的方案数

因为染色数量有限制,所以 dp 即可

周末晚会

https://www.gxyzoj.com/d/gxyznoi/p/P43

这个东西因为它的同构方式就是旋转,置换方式必然是群

如果没有 k 的限制,答案显然就是 \(\frac{1}{n}\sum_{i=1}{n}2^{gcd(i,n)}\)

但是如果有了 k 的限制,方案数无法直接计算,考虑 dp

\(f_i\) 表示长度为 \(i+1\) 的序列,头尾均为男生的方案数

这种情况下,直接枚举上一个结尾的位置,然后加上一个男生,中间放女生,前缀和解决

接下来考虑统计答案为了避免重复,循环节内除去 dp 求解的部分全部放女生,所以长度有要求

记循环节长度为 d,那么可选的间隔数为 \(d-i\),这部分再做一次前缀和即可

[poj2888]Magic Bracelet

https://www.gxyzoj.com/d/gxyznoi/p/P46

因为 n 比较大,所以先用欧拉函数优化

难点在于如何快速求出对应长度的方案数,设 \(f_{i,j,k}\) 表示以 i 为起点,j 为终点,长度为 k 的方案数

显然的,可以矩阵快速幂优化

[HNOI2009] 图的同构计数

https://www.gxyzoj.com/d/gxyznoi/p/P44

可以先将所有边都连上,然后看作双色染色

对于一个置换,求解等价的边,可以分成两种情况

  1. 循环内,如果看作正多边形,那么点与点间的连线就有 \(\lfloor \frac{len}{2}\rfloor\) 种长度

所以当交换时,只有同一长度的边颜色相同,就不会改变

  1. 循环和循环之间,显然有 \(gcd(l1,l2)\) 个集合,集合内彼此可达

所以接下来考虑怎么统计答案,显然的,不能暴力枚举所有置换,考虑枚举循环长度

假设每个循环的长度为 \(a_1,a_2,\dots\),长度为 \(i\) 的循环个数为 \(num_i\)

那么循环内排列数为 \(\prod (a_i-1)!\),选取顺序的方案数为 \(\prod a_i!\)

所以总方案数为 \(\dfrac{1}{n!}\sum\dfrac{n!}{\prod a_i\prod num_i} 2^{\sum\lfloor \frac{a_i}{2}\rfloor+\sum\sum gcd(a_i,a_j)}\)

\(n!\) 可以约掉,如果有多种颜色,可以将 2 换成 m

点击查看代码
#include<cstdio>
using namespace std;
const int mod=997;
int gcd(int a,int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
int n,b[105],num[105],ans;
int fac[105],inv[105],g[105][105],f[105];
int qpow(int x,int y)
{
	int res=1;
	while(y)
	{
		if(y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
void get(int m)
{
	int sum=0,res=1;
	for(int i=1;i<=m;i++)
	{
		sum+=b[i]/2,num[b[i]]++;
//		printf("%d ",b[i]);
		for(int j=1;j<i;j++)
		{
			sum+=g[b[i]][b[j]];
		}
		res=res*f
		[b[i]]%mod;
	}
	for(int i=1;i<=n;i++)
	{
		res=res*inv[num[i]]%mod;
		num[i]=0;
	}
	ans=(ans+res*qpow(2,sum))%mod;
//	printf("%d\n",ans);
}
void dfs(int x,int lst,int cnt)
{
	if(x==0)
	{
		get(cnt-1);
		return;
	}
	b[cnt]=x;
	dfs(0,x,cnt+1);
	for(int i=lst;i*2<=x;i++)
	{
		b[cnt]=i;
		dfs(x-i,i,cnt+1);
	}
}
int main()
{
	scanf("%d",&n);
	fac[0]=inv[0]=1;
	for(int i=1;i<=n;i++)
	{
		fac[i]=fac[i-1]*i%mod;
		inv[i]=qpow(fac[i],mod-2);
		f[i]=qpow(i,mod-2);
	}
	for(int i=1;i<=60;i++)
	{
		for(int j=1;j<=60;j++)
		{
			g[i][j]=gcd(i,j);
		}
	}
	dfs(n,1,1);
	printf("%d",ans);
	return 0;
}

4.Polya 定理

首先,有一个定义,形如 \(4 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 4\) 的首尾相同,中间不同的链称为循环

这个循环表示将 4 换到 1 的位置,1 换到 2 的位置,以此类推,记作 \((4,1,2,3)\),称为 4 元循环

一个循环中包含的数,称为这个循环的元素

置换除了采用传统的方法表示,因为它成环且不重不漏,所以可以用循环表示

例如置换 \((5,3,2,1,4)\),其中有两个环,\(5 \rightarrow 1 \rightarrow 4 \rightarrow 5\)\(3 \rightarrow 2 \rightarrow 3\)

所以它就可以表示为 \((5,1,4)(3,2)\)

当然,交换括号顺序并不对表示的置换有影响,如 \((3,2)(5,1,4)\) 仍然表示 \((5,3,2,1,4)\)

但是由于循环的表示方法,数字轮换对应的置换不变,如 \((5,1,2,3,4)\)\((1,2,3,4,5)\) 均表示置换 \((5,1,2,3,4)\)

显然,所有置换都可以用循环法表示,若不看循环之间及循环内的位置,那么两者一一对应

假设一个置换所包含的循环数记为 \(c(g)\)

假设当前有 n 个点,m 种颜色,那么记 \(h(g)\) 为不变的方案数,则必然需要每个循环点的颜色相同

所以 \(h(g)=m^{c(g)}\)

将这个东西带入 Burnside 引理的式子,有:

\[ans=\frac{1}{|G|}\sum_{i=1}^{|G|} h(g_i)=\frac{1}{|G|}\sum_{i=1}^{|G|} m^{c(g_i)} \]

[poj2154]Color

https://www.gxyzoj.com/d/gxyznoi/p/P45

首先推式子:

\[\begin{aligned}ans &= \frac{1}{n}\sum_{i=1}^n n^{gcd(n,i)}\\ &= \sum_{i=1}^n n^{gcd(n,i)-1} \\ &= \sum_{i=1}^n \sum_{d|n} n^{d-1} [gcd(i,n)=d]\\ &= \sum_{d|n} n^{d-1} \sum_{i=1}^n [gcd(i,n)=d]\\ &=\sum_{d|n} n^{d-1} \sum_{i=1}^{\frac{n}{d}} [gcd(i,\frac{n}{d})=1]\\ &= \sum_{d|n} n^{d-1}\varphi(\frac{n}{d})\end{aligned} \]

posted @ 2025-05-24 09:29  wangsiqi2010916  阅读(36)  评论(0)    收藏  举报