是谁刚逃离期末考数学的魔爪,就来学这个抽象代数,确实是很抽象了(
我摆了,更多细节证明看dalao blog吧
基本概念
群
群的定义
设 \(G\) 是非空集合,其上有二元运算\(\cdot\),如果它们满足如下性质,则称 \((G,\cdot)\) 是一个群。
-
封闭性:\(\forall a,b \in G,a \cdot b \in G\)
-
结合律:$\forall a,b,c \in G,(a \cdot b) \cdot c=a \cdot (b \cdot c) $ 且 \((a \cdot b) \cdot c \in G\)
-
单位元:有且仅有唯一的$ e \in G,\forall a \in G,e \cdot a=a \cdot e=a$
-
逆元:\(\forall a \in G,\exists b \in G,a \cdot b=b \cdot a=e\). 称 b 为 a 的逆元,记作 \(a^{-1}\)
群的性质
消去律,\(\forall a,b,c \in G\),如果 \(a \cdot c=b \cdot c\) 或 \(c \cdot a=c \cdot b\),那么有 \(a=b\)
群的例子
整数的加法群 \((Z,+)\) ,单位元是0,逆元是相反数。
衍生概念
-
阿贝尔(Abel)群:即交换群,满足交换律的群
-
半群:集合和其上的运算构成的代数结构\((G,\cdot)\) ,满足封闭性和结合律,如 \((N^+,+)\)
-
幺半群:存在单位元的半群,如 \((Z,\times)\)
-
有限群:元素个数有限的群。其元素个数称为有限群的阶,记为 \(|G|\)
-
对称群:集合G上的所有置换,在映射的复合下构成群 \(S_G\) 。单位元是恒等变换,逆元是逆映射(双射必存在逆映射)。如果集合G有限,大小为n,也记作 \(S_n\) ,称为n次对称群。
ps.置换:一个集合G到自身的双射(一一映射)称为G的一个置换。人话就是交换元素顺序。
子群
子群的定义:对于群 \((G,\cdot)\) 和它的一个非空子集 \(H\subseteq G\),如果 \((H,\cdot)\) 也是一个群,则称子集 H 是 G 的一个 子群,记作 \(H\le G\)。
- 子群判别法: 群 G 的子集 H 是子群,当且仅当 \(\forall g,h \in H\) 都有 \(g^{-1}h\in H\)。
生成子群:对于群 G 中的子集 S,从 S 中的元素出发,重复进行乘法和取逆运算有限次,能得到的所有结果的集合称为 G 的一个子群。即由子集 S 生成的子群。
对于群 G 的一个非空子集 S ,若 H 是包含 S 的 G 的子群中最小的,则子群 H 称为由子集 S 生成的子群,并记作 \(\langle S\rangle\) .
循环群:仅由一个元素生成的群。假设这个元素为x,那么也可以记作 \(\langle x\rangle\) .
另外,所有循环群都是阿贝尔群。群内给定元素的阶就是该元素生成的循环子群的阶。
陪集:对于群 G 的一个子群 H ,对于 \(a\in G\) ,定义 H 的一个左陪集为\(_aH=\lbrace a \cdot h | h \in H \rbrace\),定义 H 的一个右陪集为 \(H_a=\lbrace h \cdot a | h \in H \rbrace\),a为陪集的代表元(陪集中任何元素都可以是该陪集的代表元)
(子群陪集的定义可以类比函数的陪集去想)
陪集的性质(以右陪集为例):
H 为群 G 的一个子群。
\(\forall a \in G,|H|=|H_a|\)
\(\forall a \in G,a\in H_a\)
\(H_a=H \iff a \in H\)
\(H_a=H_b \iff ab^{-1} \in H\)
$H_a \cap H_b \neq \varnothing \iff H_a = H_b $
拉格朗日定理:(根据以上性质推得)
有限群的阶必然是子群的阶的整数倍。
具体的,对于有限群 \(G\) 和它的子群 \(H\leq G\),\(|G|=|H| \times [ G : H ]\)
其中 $ [ G : H ]$ 表示 G 中 H 不同的陪集数(左右均可),称为群 G 中子群 H 的指数。
好的其实我才不会告诉你,之前那些全是废话,看不懂没关系。以下正文开始。
置换群
有限集合到自身的双射称为置换,人话就是重新排列集合的元素
其实会做题就行,那些抽象概念没用
小结论是:一个置换,可以被分解为不相交的若干个轮换(轮换就是按顺序每次滚动1)
[poj2369]Permutations
置换群经典手法:我们把每次置换的初始元素到目标元素连边,可以发现,每个元素的出度入度均为1.那么实际上我们就可以把这个置换划分成若干个环。每条边都代表一次置换。
那么如果需要求最小置换次数,使得原始集合复原,其实就是这些环长的最小公倍数。
[USACO07FEB] Cow Sorting G
显然要求每个奶牛移到正位上的的最小交换次数\(num_i\)。总贡献是 \(\sum_{i=1}^n a_i*num_i\)
其实仔细观察一下,还是按照那个置换始末连边的处理手法,就是交换会成环!!然后贡献就是环上点贡献之和*2-相邻两元素之和的最大值。
[POI2009] SLO-Elephants
完全同上
[HNOI2010] 物品调度
这题重点考观察形式+并查集吧……
考虑题目中给出的 \(pos_i=(c_i+d \times x_i +y_i) \mod n\) 的构造方式。发现形如一个 \(kx+b \mod n\) 形式,而在不同的起点 \((b\) 或 \(c_i+y_i)\) 之下,能得到的最终位置随x增大逐个相连会成环。
x增大即为环内元素挨个向后取,y增大即为不同起点的环间移动。
注意这个环内和环间要开两个并查集维护!
首先不能用set,因为环内两相邻元素的差是d,而一共有 \(gcd(n,d)\) 个不同起点,环内元素顺序不一定从小到大;其次,两个东西不能用一个并查集维护,因为如果真的成环,它就要求环上的每一个点都能通过环相互到达,但并查集显然不能连出环这个东西。
最后的求步数就是套路。
[poj3128]Leonardo's Notebook
莫名其妙找规律题,怎么说,画上十几个图规律也就找到了。
还是考虑找置换的环。而这次,一条边相当于两次置换,可以假设边上有一个中转点。
首先,奇环是可以直接将每条边上的中转点取成对角上的字母,能够自我循环满足两次排列。对答案没有任何影响。
原置换中的偶环循环两次一定会被分割成两个更小的环,也就是说,偶环一定是成对出现的。(奇环已经被讨论掉了)
判断偶环即可。
Burnside引理
定义 \(A,B\) 是两个有限集合,\(X=B^A\) 表示所有 \(A\) 到 \(B\) 的映射,\(G\) 是作用在 \(A\) 上的一个置换群。
对于每个 \(x\in X\) :
\(G^x= \lbrace g|g(x)=x,g\in G \rbrace\) ,称 \(G^x\) 为 \(x\) 的稳定子(就是置换前后做映射x结果相同)
\(G(x)=\lbrace g(x)|g\in G \rbrace\) ,称 \(G(x)\) 为 \(x\) 的轨道(就是 \(G\) 中所有置换做映射x得到的结果)
这里会有一个轨道-稳定子定理,用于证明 Burnside引理(但算法竞赛主要是会用嘛,证明不太重要,主要是我不会)
若 \(X\) 的两个映射经过 \(G\) 中的置换后相等,则称两个映射在同一等价类中。
定义 \(X/G\) 表示 \(G\) 作用在 \(X\) 上产生的所有等价类的集合。而 \(|X/G|\) 称为轨道数,实际上就是 \(X\) 中本质不同的映射个数。
又,\(X^g=\lbrace x|g(x)=x,x\in X \rbrace\) ,称 \(X^g\) 是 \(X\) 在置换 \(g\) 下的不动点集合,就是一个映射集合中经过置换 \(g\) 后不改变结果的映射个数。
有 Burnside引理 : \(|X/G|=\frac{1}{|G|} \sum_{g\in G} |X^g|\)
特别关注的是,该引理在 \(X \subseteq B^A\) 时依然成立。就是给映射加上一些限制条件后还能用。
抽象式子无法理解没有关系,看后面例题中如何应用。
Polya定理
其实就是 Burnside引理 的一种特殊情况。
\(|X/G|=\frac{1}{|G|} \sum_{g\in G} |B|^{c(g)}\)
其中 \(c(g)\) 表示置换 \(g\) 拆分出来的轮换数量。
证明只需要考虑 \(|B|^{c(g)}=|X^g|\) . 因为置换可以写成几个轮换的形式,那么若要求 \(X\) 中的一个映射是关于 \(g\) 的不动点,那么每一个轮换的映射是一样的即可。每一个轮换有 \(|B|\) 种选择,所以 \(|X^g|=|B|^{c(g)}\).
此时必须要求每个映射都合法,即 Polya定理 只在 \(X=B^A\) 时成立。
有人说,Burnside引理 和 Polya定理 实际上就是更改了枚举计算对象。故,使用情景下关键是考虑题目限制条件以及 \(c(g)\) 和不动点数量哪个好求。
例题
[HNOI2008]Cards
题目中“洗牌法”完美满足置换群的性质,但记得加上一个恒等置换。注意到此题映射不完整,要满足红、蓝、绿的个数限制,所以只能用 Burnside引理 。
\(|X/G|=\frac{1}{|G|} \sum_{g\in G} |X^g|\)
再次理解这个式子的形式。G是我们洗牌的置换集合,X可以简单理解为牌对颜色的映射。那么这里式子的含义就是本质不同的染色方案数等于每个变换中不动点个数的算数平均值。
需要计算不动点个数。
先将置换分解成轮换,那么每个轮换内的点都必须是一个颜色。将轮换当成物品,三个颜色当成背包,这就是经典的背包问题,\(O(n^3)\) dp解决。
[JZOJ4800] 周末晚会
开始始终都没想到置换的表示,一直以为普通容斥就能做,再加上有k个女生不能相邻这层限制。
但是圆桌,本质不同,本身就给我们提示了一个旋转的置换。而且还是满足群的限制的,并且不动点就是要求旋转 \(i\) 个人时,循环节为 \(gcd(n,i)\) ,即每 \(\frac{n}{gcd(n,i)}\) 个人都是一样的。
由于k个女生不能相邻的限制,导致产生了 \(X\subseteq B^A\) ,所以只能用 Burnside引理。我们发现 Burnside引理 经常和dp相结合,dp就是为了满足题目中所给的限制条件。
dp细节很多。我们只需要枚举计算d个人之内的dp状态就可以。但格外注意的是“拼接”!拼接时不能超过k个女生在一起,那么不妨设dp状态就是开头结尾都是男生的状态。用前缀和优化可以做到O(n),不优化也行。
最后考虑拼接处的女生个数,逐一枚举,还需要用段长d减去dp内已经算过的长度!然后去插空。
[模板] Polya 定理
题目给的环的置换很明显,且不动点的数量不可求。用Polya定理,直接列出。
\(ans=\frac{1}{n}\sum_{i=1}^n n^{gcd(i,n)}\)
观察式子,发现gcd形式,可以直接拆!
化简出来是 \(ans=\sum_{d|n} n^{d-1} \sum_{i=1}^{\frac{n}{d}} [gcd(i,\frac{n}{d})=1]\)
然后我死活没看出来后面一坨是欧拉函数。 继续化简 \(ans=\sum_{d|n} n^{d-1} \varphi(\frac{n}{d})\) .欧拉函数暴力求就行。
发现规律:使用 Polya定理 的题目一般都是直接拆式子!
[poj2888]Magic Bracelet
注意到n的范围很大,但是还有限制条件,只能用 Burnside引理。
又是经典的环形置换。先把关于gcd的dp式子写出来,dp[i][j]表示以j结尾,长度为i的方案数。
这时候好好读题的同学们都发现了(因为我一开始没看见),m的范围很小。考虑直接O(m)枚举开头元素k,最后dp到gcd+1,直接取以k结尾的方案数,就能解决珠子不相邻的问题。然后我们惊讶的发现,这个dp转移式子可以写成矩阵快速幂的形式!a[i][j]为0/1表示i能否与j相邻。
对于整体的式子,发现这个dp只和gcd有关,直接考虑用上一题的方法化简。\(ans=\frac{1}{n}\sum_{i=1}^n solve(gcd(i,n))=\frac{1}{n}\sum_{d|n}solve(d)\varphi(\frac{n}{d})\)
最终复杂度 \(O(T(n^{\frac{3}{4}}+\sqrt n m^3logn))\) .
[HNOI2009]图的同构/[SHOI2006] 有色图
实际上是同一道题,前者是后者m=2的情况。直接考虑后者。
这里为了方便表述,把表示颜色个数的 m 更改为 col。
先找映射,很奇怪的是,“点,边,边的颜色”,是三个东西找关系。没想到就是直接考虑从点到边的颜色的映射。
发现难以直接理解每个置换的轮换数量。不妨从 Burnside引理 出发,考虑不动点。(最终推出来其实就是 Polya定理)画图找规律,发现点对边的影响跟边的端点是否在同一轮换有关。分类讨论。
1.在一个轮换。画图可知,对于一个长 \(x\) 的环,我们把它画成正 \(x\) 边形,不同的边的长度有 \(\lfloor \frac{x}{2} \rfloor\) 个,而对于每个顶点,发出的每种长度的边数都是固定的。每种长度,我们在进行置换点的时候,它会在环上走一圈,所以必须同色。
2.不在一个轮换。设两边轮换长度分别为 \(x,y\),那么在进行轮换时,在 \(xy\) 条边中,同样由于换点的时候同样会让边转一圈,转 \(lcm(x,y)\) 次会回到初始状态,则会有 \(gcd(x,y)\) 组可以是不同颜色的边集。
设共 \(m\) 个轮换,这样的边集(等价类)有 $k=\sum_{i=1}^m \lfloor \frac{a_i}{2} \rfloor +\sum_{i=1}^m \sum_{j=1}^{i-1} gcd(a_i,a_j) $ 个,这个 \(k\) 其实就是边的轮换数。所以对于每种置换,有 \(m^k\) 种选颜色的方法,也就是不动点集合。
然后我们惊讶地发现,这个置换群的大小,就是点的排列数,是 \(n!\) 的,复杂度爆炸。
考虑实际上这个式子只和轮换的长度集合 \(a_1,a_2,...,a_m\) 有关,且轮换结果和顺序无关,即不同置换会拆成严格不同轮换集合,不妨设 \(a_1\leq a_2\leq ... \leq a_n\) .
考虑如何计算能涵盖的置换数。划分 \(n\) 为 \(a_1,a_2,...,a_m\) 的集合,方案数为 \(\frac{n!}{\prod a_i!}\) .轮换的内部成环且有序,则排序方案为 \((a_i-1)!\) . 最后,我们发现,开始计算的时候是假定了从 \(1,2,...,m\) 有序的空位去填入 \(n\). 这样能保证 \(a_i\) 大小不同的集合无序,但会计入 \(a_i\) 相等的集合的顺序,所以要额外除掉 \(\prod c_i!\),其中 \(c_i\) 为每种 \(a_i\) 的出现次数。
最终的式子为 \(ans=\frac{1}{n!} \sum_{g \in G} col^k=\frac{1}{n!}\sum \frac{col^kn!}{\prod a_i \prod c_i!}=\sum \frac{col^k}{\prod a_i \prod c_i!}\) , 对于枚举到的a数组的每种情况,$k=\sum_{i=1}^m \lfloor \frac{a_i}{2} \rfloor +\sum_{i=1}^m \sum_{j=1}^{i-1} gcd(a_i,a_j) $ .
在 \(n\leq 60\) 的条件下,这个式子我们就可以暴搜去求了。
标签:frac,cdot,置换,子群,sum,Burnside,引理,Polya,轮换 From: https://www.cnblogs.com/YYYmoon/p/18675592