群的定义

在数学中,群是由一种集合以及一个二元运算所组成的,符合“群公理”的代数结构。

一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算。二元运算用 \(\cdot\) 表示,它结合了任意两个元素 \(a\) 和 \(b\) 形成了一个属于 \(G\) 的元素,记为 \(a\cdot b\)。

群的公理化定义

群公理包含下述四个性质(有时略去封闭性,只有三个性质)。若非空集合 \(G\) 和 \(G\) 上的运算 \(\cdot\) 构成的代数结构 \((G,\cdot\ )\) 满足以下性质:

  1. 封闭性: 对于所有 \(G\) 中 \(a,b\),运算 \(a\cdot b\) 的结果也在 \(G\) 中。

  2. 结合律: 对于 \(G\) 中所有的 \(a,b,c\) ,等式 \((a\cdot b)\cdot c=a\cdot (b\cdot c)\) 成立。

  3. 单位元: \(G\) 中存在一个元素 \(e\),使得对于 \(G\) 中的每一个 \(a\),都有一个 \(e\cdot a=a\cdot e=a\) 成立。这样的元素是独一无二的。它被称为群的标识元素。

  4. 逆元: 对于每个 \(G\) 中的 \(a\) ,总存在 \(G\) 中的一个元素 \(b\) 使 \(a\cdot b=b\cdot a=e\),此处 \(e\) 为单位元,称 \(b\) 为 \(a\) 的逆元,记为 \(a^{-1}\)。

则称 \((G,\cdot\ )\) 为一个 。例如,整数集和整数间的加法 \((Z,+)\) 构成一个群,单位元是 \(0\),一个整数的逆元是它的相反数。

\[\]

置换

置换的定义

有限集合到自身的双射(即一一对应)称为置换。集合 \(S=\{a_1,a_2,...,a_n\}\) 上的置换可以表示为

\[f=\begin{pmatrix} a_1,a_2,...,a_n\\ a_{p_1},a_{p_2},...,a_{p_n} \end{pmatrix}
\]

意为将 \(a_i\) 映射为 \(a_{p_i}\) ,其中 \(p_1,p_2,...,p_n\) 是 \(1,2,...,n\) 的一个排列。显然 \(S\) 上所有置换的数量为 \(n!\)。

置换的乘法

对于两个置换 \(
f=\begin{pmatrix} a_1,a_2,...,a_n\\ a_{p_1},a_{p_2},...,a_{p_n} \end{pmatrix}
\) 和 \(
g=\begin{pmatrix} a_{p_1},a_{p_2},...,a_{p_n}\\ a_{q_1},a_{q_2},...,a_{q_n} \end{pmatrix}
\),\(f\) 和 \(g\) 的乘积记为 \(f\circ g\) ,其值为:

\[f\circ g=\begin{pmatrix} a_1,a_2,...,a_n\\ a_{q_1},a_{q_2},...,a_{q_n} \end{pmatrix}
\]

简单来说就是先后经过 \(f\) 的映射,再经过 \(g\) 的映射。

置换群

易证,集合 \(G\) 上的所有置换关于置换的乘法满足封闭性、结合律、有单位元(恒等置换,即每个元素映射成它自己)、有逆元(交换置换表示中的上下两行),因此构成一个群。这个群的任意一个 子群 即称为 置换群

置换群通常用来解决一些涉及“本质不同”的计数问题,例如用 3 种颜色给一个立方体染色,求本质不同的方案数(经过翻转后相同的两种方案视为同一种)。

循环置换

循环置换是一类特殊的置换,可表示为

\[(a_1,a_2,...,a_n)=\begin{pmatrix} a_1,a_2,...,a_n\\ a_{2},a_{3},...,a_{1} \end{pmatrix}
\]

若两个循环置换不含有相同的元素,则称它们是 不相交 的。有如下定理:

任意一个置换都可以分解为若干不相交的循环置换的乘积,例如:

\[\begin{pmatrix} a_1,a_2,a_3,a_4,a_5\\ a_3,a_2,a_1,a_5,a_4 \end{pmatrix}=\begin{pmatrix} a_1,a_2,a_3\\ a_3,a_2,a_1 \end{pmatrix}\circ \begin{pmatrix} a_4,a_5\\ a_5,a_4 \end{pmatrix}
\]

该定理的证明也非常简单。如果把元素视为图的节点,映射关系视为有向边,则每个节点的入度和出度都为 1,因此形成的图形必定是若干个环的集合,而一个环即可用一个循环置换表示。

\[\]

Burnside 引理

\[|X/G|=\frac 1 {|G|}∑_{g∈G}|x^g|
\]

证明

考虑一个等价类,有

\[|x||g^x|=|G|,x∈X/G
\]

其中,\(x\) 为 \(X\) 的一个等价类,\(|g_x|\) 为使它不发生改变的置换个数,

\(G\) 为总置换个数,\(X/G\) 为 \(X\) 在 \(G\) 置换群下的等价类的集合。

可以感性认知,对于一个等价类,有 \(|g_x|\) 种使它不发生改变的置换,

因为对于等价类 \(x\),本质不同的置换可以其中一个元素变为其他任意元素,所以有 \(|x|\) 种。

\[本质不同的置换个数×不变的置换个数=总置换个数。
\]

考虑枚举每一个等价类,有

\[∑_{x∈X/G}|x||g_x|=|G|⋅|X/G|
\]

每一个等价类对右式的贡献为 \(|G|\),共 \(|X/G|\) 个。

考虑交换枚举顺序,有

\[∑_{x∈X}|g_x|=∑_{g∈G}|x^g|
\]

其中 \(x\) 指 \(X\) 的一个元素,\(|g_x|\) 为使它不发生改变的置换个数,

此处的 \(|g_x|\) 与上面相同,因为同一个等价类 \(|g_x|\) 一定相同。

等式右半部分 \(g\) 为 \(G\) 中的一个置换,\(|x^g|\) 为在该置换下不发生改变的元素个数。

由于 \(∑_{x∈X/G}|x|\) 可以等价于枚举完所有的元素,有

\[|G|⋅|X/G|=∑_{x∈X/G}|x||g_x|(x指等价类)\\
=∑_{x∈X}|g_x|(x指元素)\\
=∑_{g∈G}|x^g|
\]
\[\]

Pólya 定理

\[|Y^X/G|=\frac 1 {|G|}∑_{g∈G}|Y|^{c(g)}
\]

即:

\[染色方案数(等价类的个数)=\frac 1 {珠子数(总置换数)}∑_{对于每种置换}颜色数(映射数)^{循环节数}
\]

由 \(\text{Burnside}\) 引理显然可得。

例题

给定一个 \(n\) 个点,\(n\) 条边的环,有 \(n\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案 ?

考虑枚举所有置换,可以将环顺时针旋转 \(1\) ~ \(n\) 个珠子的位置,共 \(n\) 种置换。

其中长度为 \(i\) 的置换会将整个环分成 \(gcd(n,i)\) 个部分,每部分颜色相同。

因此答案为:

\[\frac 1 n\sum_{i=1}^{n}n^{gcd(n,i)}
\]

此时复杂度为 \(O(n)\) ,考虑枚举 \(gcd(i,n)\):

\[\frac 1 n\sum_{d|n}n^{d}\sum_{i=1}^{n}[gcd(i,n)==d]\\
=\frac 1 n\sum_{d|n}n^{d}\varphi(\frac{n}{d})
\]

即可在 \(O(\sqrt n)\) 时间复杂度内解决该问题。

【模板】Pólya 定理

#include<bits/stdc++.h>
using namespace std;
int T;
const long long md=1e9+7;
inline long long phi(long long x){
long long res=x;
for(int i=2;1ll*i*i<=x;i++){
if(x%i==0){
res-=res/i;
while(x%i==0)x/=i;
}
}
if(x^1)res-=res/x;
return res%md;
}
inline long long pwr(long long x,long long y){
long long res=1;
while(y){
if(y&1)res=res*x%md;
x=x*x%md;y>>=1;
}return res;
}
inline void solve(){
long long n;scanf("%lld",&n);
long long res=0;
for(int i=1;1ll*i*i<=n;i++){
if(n%i==0){
res=(res+pwr(n,n/i)*phi(i))%md;
if(i*i!=n)res=(res+pwr(n,i)*phi(n/i))%md;
}
}
printf("%lld\n",res*pwr(n,md-2)%md);
}
int main(){
scanf("%d",&T);
while(T--)solve(); return 0;
}

Burnside 引理与 Pólya 定理的更多相关文章

  1. @总结 - 12@ burnside引理与pólya定理

    目录 @0 - 参考资料@ @1 - 问题引入@ @2 - burnside引理@ @3 - pólya定理@ @4 - pólya定理的生成函数形式@ @0 - 参考资料@ 博客1 @1 - 问题引 ...

  2. 数学:Burnside引理与Pólya定理

    这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...

  3. 置换群和Burnside引理,Polya定理

    定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合. 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等. 不动点:一个置换中,置换后和置换前没 ...

  4. Burnside引理与polay定理

    #Burnside引理与polay定理 引入概念 1.置换 简单来说就是最元素进行重排列 是所有元素的异议映射,即\([1,n]\)映射到\([1,n]\) \[ \begin{pmatrix} 1& ...

  5. Burnside引理与Polya定理

    感觉这两个东西好鬼畜= = ,考场上出了肯定不会qwq.不过还是学一下吧用来装逼也是极好的 群的定义 与下文知识无关.. 给出一个集合$G = \{a, b, c, \dots \}$和集合上的二元运 ...

  6. Burnside引理与Polya定理 学习笔记

    原文链接www.cnblogs.com/zhouzhendong/p/Burnside-Polya.html 问题模型 有一个长度为 $n$ 的序列,序列中的每一个元素有 $m$ 种取值. 如果两个序 ...

  7. 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法

    [POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...

  8. 【BZOJ1004】[HNOI2008]Cards Burnside引理

    [BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...

  9. 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)

    题目来源:UVa 10294 Arif in Dhaka (First Love Part 2) 题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转 [分析] 要开始学置换了. ...

随机推荐

  1. C++基础-3-函数

    3. 函数 3.1 函数默认参数 1 #include<iostream> 2 using namespace std; 3 4 //函数的默认参数 5 //自己传参,就用自己的,如果没有 ...

  2. 1.11 Linux的主要应用领域有哪些?

    与Windows操作系统软件一样,Linux 也是一个操作系统软件.但与Windows不同的是,Linux是一套开放源代码程序的,并可以自由传播的类UNIX操作系统软件,随着信息技术的更新变化,Lin ...

  3. 阿里CBU技术面试小结

    一个执着于技术的公众号 前言 今天给大家分享一篇胡文兴同学阿里CBU技术面试的自我总结,希望通过本篇文章也让正在准备求职面试的你有所帮助. 本篇文章已经征得原作者同意转载至本公众号,并且征得他的同意标 ...

  4. git提交代码到GitHub操作-简易版(后续完善)

    一.git上传代码到GitHub 1.远程仓库GitHub创建好一个新仓库注意仓库名 2.本地建一个目录写代码,目录名与仓库命名一致 3.在目录下右键 git Bash here 打开git终端命令行 ...

  5. Python模块 | EasyGui

    (Python模块 | EasyGui | 2021/04/08) 目录 什么是 EasyGUI? [EasyGui中的函数] msbox | 使用示例 ynbox | 使用示例 ccbox | 使用 ...

  6. CSS 不规则的轮廓-outline

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  7. 海量数据存储ClickHouse

    ClickHouse介绍 ClickHouse的由来和应用场景 俄罗斯Yandex在2016年开源,使用C++编写的列式存储数据库,近几年在OLAP领域大范围应用 官网:https://clickho ...

  8. 『忘了再学』Shell基础 — 13、环境变量(一)

    目录 1.用户自定义的环境变量 (1)环境变量设置 (2)查询自定义环境变量 (3)删除自定义环境变量 2.系统自带的环境变量--PATH环境变量 (1)PATH环境变量 (2)PATH环境变量的作用 ...

  9. Git拉取远程新分支

    1.查看本地分支  git branch 2.查看远程分支  git branch -a 3.如果要拉取的远程分支本地没有 git fetch 4.拉取远程新分支到本地 git checkout -b ...

  10. 【leetcode】239. 滑动窗口最大值

    目录 题目 题解 三种解法 "单调队列"解法 新增.获取最大值 删除 代码 题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以 ...