Burnside引理与Polya定理 学习笔记
原文链接www.cnblogs.com/zhouzhendong/p/Burnside-Polya.html
问题模型
有一个长度为 $n$ 的序列,序列中的每一个元素有 $m$ 种取值。
如果两个序列循环同构,那么我们称这两个序列等价。
求两两不等价的序列个数。
Burnside引理
假设有若干个置换 $P_1,P_2,\cdots$ ,设由这些置换生成的置换群为 $Q$ 。如果序列 A 可以通过一个 $Q$ 中的置换变成序列 B,那么我们认为 A 和 B 等价。
对于一个置换 $P$ ,如果序列 A 经过置换 $P$ 之后不变,那么我们称序列 A 为置换 $P$ 的一个“不动点”。令 $C(P)$ 表示置换 $P$ 的不动点数。
Burnside引理:
对于一个置换群 $Q$,两两不同的序列个数为
$$\frac 1 {|Q|} \sum_{P\in Q} C(P)$$
Polya定理
Polya定理是Burnside引理的一个具体化。
Polya定理:
假设置换 $P$ 由 $k$ 个轮换组成,那么
$C(P) = m^{k}$
至此,我们已经可以解决最开始的问题模型了。
$$ans = \frac 1n \sum_{i=0}^{n-1} m ^ {\gcd(i,n)}$$
例题 - POJ2409 Let it Bead
题意
有一种项链有 $n$ 个珠子,珠子有 $m$ 种。项链是环,但是没有起始点,也没有方向。也就是说,如果两个项链循环同构或者对称翻转后循环同构,那么他们等价。
求不等价的项链种数。
$n\cdot m \leq 32$ 。
题解
这类问题,我们首先考虑一下置换群 $Q$ 中有哪些元素。
1. 旋转。可以旋转 $0\cdots n-1$ 次,故有 $n$ 种方案。这部分等价于本文开头的问题模型。
2. 翻转。由于任何形如 “旋转 + 翻转 + 旋转” 的操作都可以由一次翻转得到,所以本质上只有翻转操作。不管 $n$ 是奇数还是偶数,都有 $n$ 种本质不同的翻转操作,而且这些操作与之前的旋转也不同。
所以,置换群 $Q$ 中共有 $2n$ 种置换。
现在我们考虑求 $\sum C(P)$ 。
对于 1. 旋转,之前已经提到,这种情况对答案的贡献就是
$$\sum_{i=0}^{n-1} m ^ {\gcd(i,n)}$$
对于 2. 翻转,我们分 $n$ 的奇偶性进行讨论:
n 为奇数:只能将一个顶点与其对边中点所在直线作为对称轴进行翻转:一共有 $n$ 种方案,每种方案都由 $\frac {n+1} 2$ 个轮换构成,故对答案的贡献是
$$n \cdot m ^ {\frac {n+1} 2}$$
n 为偶数:有两种情况:
1. 以两个顶点所在直线为对称轴进行翻转:一共有 $\frac n 2$ 种方案,每种方案都由 $\frac{n+2} 2$ 个轮换构成,故对答案的贡献是
$$\frac n2 \cdot m ^ {\frac {n+2} 2} $$
2. 以两条边的中点所在直线为对称轴进行翻转:一共有 $\frac n 2$ 种方案,每种方案都由 $\frac{n} 2$ 个轮换构成,故对答案的贡献是
$$\frac n2 \cdot m ^ {\frac {n} 2} $$
至此,问题解决。
代码
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef long long LL;
int n,m;
LL Pow(LL x,LL y){
LL ans=1;
for (;y;y>>=1,x*=x)
if (y&1)
ans*=x;
return ans;
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
while (1){
cin>>m>>n;
if (!n&&!m)
break;
LL ans=0;
for (int i=0;i<n;i++)
ans+=Pow(m,gcd(n,i));
if (n&1)
ans+=Pow(m,(n+1)>>1)*n;
else {
ans+=Pow(m,n>>1)*(n>>1);
ans+=Pow(m,(n+2)>>1)*(n>>1);
}
ans/=n<<1;
cout<<ans<<endl;
}
return 0;
}
Burnside引理与Polya定理 学习笔记的更多相关文章
- 置换群和Burnside引理,Polya定理
定义简化版: 置换,就是一个1~n的排列,是一个1~n排列对1~n的映射 置换群,所有的置换的集合. 经常会遇到求本质不同的构造,如旋转不同构,翻转交换不同构等. 不动点:一个置换中,置换后和置换前没 ...
- Burnside引理与Polya定理
感觉这两个东西好鬼畜= = ,考场上出了肯定不会qwq.不过还是学一下吧用来装逼也是极好的 群的定义 与下文知识无关.. 给出一个集合$G = \{a, b, c, \dots \}$和集合上的二元运 ...
- Polya 定理 学习笔记
群 群的定义 我们定义,对于一个集合 \(G\) 以及二元运算 \(\times\),如果满足以下四种性质,那我们就称 \((G,\times)\) 为一个群. 1. 封闭性 对于 \(a\in G, ...
- Burnside引理和Polya定理之间的联系
最近,研究了两天的Burnside引理和Polya定理之间的联系,百思不得其解,然后直到遇到下面的问题: 对颜色限制的染色 例:对正五边形的三个顶点着红色,对其余的两个顶点着蓝色,问有多少种非等价的着 ...
- Burnside引理和Polya定理
转载自:https://blog.csdn.net/whereisherofrom/article/details/79631703 Burnside引理 笔者第一次看到Burnside引理那个公式的 ...
- Burnside引理与polay定理
#Burnside引理与polay定理 引入概念 1.置换 简单来说就是最元素进行重排列 是所有元素的异议映射,即\([1,n]\)映射到\([1,n]\) \[ \begin{pmatrix} 1& ...
- @总结 - 12@ burnside引理与pólya定理
目录 @0 - 参考资料@ @1 - 问题引入@ @2 - burnside引理@ @3 - pólya定理@ @4 - pólya定理的生成函数形式@ @0 - 参考资料@ 博客1 @1 - 问题引 ...
- 【BZOJ1488】[HNOI2009]图的同构(Burside引理,Polya定理)
[BZOJ1488][HNOI2009]图的同构(Burside引理,Polya定理) 题面 BZOJ 洛谷 题解 求本质不同的方案数,很明显就是群论这套理论了. 置换一共有\(n!\)个,考虑如何对 ...
- 数学:Burnside引理与Pólya定理
这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...
随机推荐
- sql 找出不包含字母、不包含汉字的数据
--1.不包含字母 SELECT * FROM t WHERE str NOT LIKE '%[a-zA-Z]%' SELECT * FROM t --2.不包含汉字 SELECT * FROM t ...
- 记录一次Oracle注入绕waf
这个注入挺特殊的,是ip头注入.我们进行简单的探测: 首先正常发起一次请求,我们发现content-type是76 探测注入我习惯性的一个单引号: 一个单引号我发现长度还是76 我开始尝试单引号,双引 ...
- Python操作文件-20181121
Python操作文件 Python操作文件和其他语言一样,操作的过程无非是先定位找到文件.打开文件,然后对文件进行操作,操作完成后关闭文件即可. 文件操作方式:对文件进行操作,主要就是读.写的方式,p ...
- (二分查找 结构体) leetcode33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- jdbc增删改查进行封装
jdbc封装 1 dao (代码分层) com.aaa.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据 com.aaa.servlet 存放servle ...
- 2018-2019-2 《Java程序设计》第3周学习总结
20175319 2018-2019-2 <Java程序设计>第3周学习总结 教材学习内容总结 第三周通过课本与蓝墨云上的视频学习了<Java2实用教程>第四章类与对象 成功激 ...
- 点评cat系列-应用集成
========================消息的基本属性========================消息的几个属性:type: 定义消息的 category, 比如 SQL 或 RPC 或 ...
- Groovy 设计模式 -- 适配器模式
Adapter Pattern http://groovy-lang.org/design-patterns.html#_adapter_pattern 适配器模式,对象存在一个接口, 此接口在此对象 ...
- lsof/netstat命令的一个重要作用: 根据进程查端口, 根据端口查进程
我们知道, 根据ps -aux | grep xxx就是很快实现进程名和进程号的互查, 所以我们只说进程号pid就行. 如下示例中, 进程pid常驻. 1. 根据进程pid查端口: lsof -i ...
- 微信app支付的坑
app支付商户申请,需注册并认证开放平台账号后电脑端登录开放平台官网:open.weixin.qq.com,[管理中心]->[移动应用],选择需要申请支付的应用,点击[查看]->[微信支付 ...