burnside引理&polya定理


参考资料:

《polya计数法的应用》--陈瑜希

黄学长


  1. 置换:

    置换即是将n个元素的染色进行交换,产生一个新的染色方案。

  2. 群:

    一个元素的集合G与一个二元运算(*)构成一个群。群满足以下性质:

    1. 封闭性:\(\forall a,b \in G,\exists c\in G ,c=a*b\)

    2. 结合律:\(\forall a,b,c,(a*b)*c=a*(b*c)\)

    3. 单位元:\(\exists e\in G,\forall a,a*e=e*a=a\)

    4. 逆元:\(\forall a\in G,\exists b\in G,a*b=b*a=e,b=a^{-1}\)

  3. 置换群:

    即对于置换的集合的群,其中的二元运算为置换的连接,即对一个染色方案置换后的方案进行置换。

  4. burnside引理:

    burnside引理用来求在一个置换群的置换集合下本质不同的染色方案数,公式为

    \[L=\frac{1}{|G|}\sum_j D(a_j)
    \]

    其中,L表示本质不同的染色方案数,|G|表示置换个数,\(D(a_j)\)表示在\(a_j\)置换下不变的染色方案数。

    证明的话,有兴趣的可以自己看看论文,反正我不会证。。。

  5. polya定理:

    使用burnside引理时,需要求出在某一个置换下不变的染色方案数,而在某些情况下,这种东西并不好求。

    循环:在一个置换中,形成的一个环的结构,称为循环。一个置换中的循环数称为循环节数。

    当有m种颜色时,\(D(a_j)=m^{cj}\)其中,\(c_j\)为置换的循环节数。


例题:

bzoj1004

题意为给出一个置换群,有三种颜色,每种颜色有数量限制,求本质不同的染色方案。

首先枚举每个置换。对于一个置换,在该置换下不变的元素在循环处颜色一定相同。找到该置换下的循环,做三维背包即可。

程序参考自hzwer

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int Maxn=70; int vis[Maxn],n,p,a[Maxn][Maxn],f[Maxn][Maxn][Maxn];
int r,b,g,siz[Maxn],m,ans; int powp(int a,int b,int mod) {
int ans=1;
while(b) {
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
} int dp(int x) {
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
if(vis[i]==0) {
vis[i]=1;
cnt++;
siz[cnt]=1;
int p=i;
while(vis[a[x][p]]==0) {
siz[cnt]++;
p=a[x][p];
vis[p]=1;
}
}
memset(f,0,sizeof(f));
f[0][0][0]=1;
for(int o=1;o<=cnt;o++)
for(int i=r;i>=0;i--)
for(int j=b;j>=0;j--)
for(int k=g;k>=0;k--) {
if(i>=siz[o]) f[i][j][k]=(f[i][j][k]+f[i-siz[o]][j][k])%p;
if(j>=siz[o]) f[i][j][k]=(f[i][j][k]+f[i][j-siz[o]][k])%p;
if(k>=siz[o]) f[i][j][k]=(f[i][j][k]+f[i][j][k-siz[o]])%p;
}
return f[r][b][g];
} int main() {
scanf("%d%d%d%d%d",&r,&b,&g,&m,&p);
n=r+b+g;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
m++;
for(int i=1;i<=n;i++) a[m][i]=i;
for(int i=1;i<=m;i++) ans+=dp(i);
printf("%d\n",ans%p*powp(m,p-2,p)%p);
return 0;
}

burnside引理&polya定理的更多相关文章

  1. 置换群 Burnside引理 Pólya定理(Polya)

    置换群 设\(N\)表示组合方案集合.如用两种颜色染四个格子,则\(N=\{\{0,0,0,0\},\{0,0,0,1\},\{0,0,1,0\},...,\{1,1,1,1\}\}\),\(|N|= ...

  2. Burnside引理&Pólya定理

    Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...

  3. 【等价的穿越】Burnside引理&Pólya计数法

    Problem 起源: SGU 294 He's Circle 遗憾的是,被吃了. Poj有道类似的: Mission 一个长度为n(1≤n≤24)的环由0,1,2组成,求有多少本质不同的环. 实际上 ...

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

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

  5. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  6. hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

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

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

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

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

  9. Burnside 引理与 Pólya 定理

    群 群的定义 在数学中,群是由一种集合以及一个二元运算所组成的,符合"群公理"的代数结构. 一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算.二元运算用 \(\cdot ...

随机推荐

  1. Android N 7 【 classes.dex】反编译失败:com.googlecode.d2j.DexException: not support version.

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. D:\Android反编译工具[全]\2016\d ...

  2. 日志系统实战 AOP静态注入

    http://www.cnblogs.com/mushroom/p/3932698.html http://www.cnblogs.com/mushroom/p/4124878.html http:/ ...

  3. go http 文件下载

    package main import ( "fmt" "net/http" "os" ) func DownFile() { userFi ...

  4. Linux登录失败处理功能

     本文要实现的功能:如果有人恶意尝试破解你的服务器密码,那么这个功能就能帮你起到一定的作用,当尝试密码错误超过设定的次数后,就会锁定该账户多长时间(自行设定),时间过后即可自行解锁,这样可以增加攻击者 ...

  5. 基于JDK1.8的LinkedList源码学习笔记

    LinkedList作为一种常用的List,是除了ArrayList之外最有用的List.其同样实现了List接口,但是除此之外它同样实现了Deque接口,而Deque是一个双端队列接口,其继承自Qu ...

  6. 热词统计以及Quartz.net的简单使用

    一.热词统计 方案一: 设计一个表:ID       KeyWord     Count 当用户再输入框中查询的时候,我们就往表中插入数据,在插入之前首先判断是否已经存在keyword,存在的话,让C ...

  7. throw and throws in Java

    throw and throws in Java - GeeksforGeeks https://www.geeksforgeeks.org/throw-throws-java/ throw and ...

  8. Network---3694poj(桥与LCA)

    题目链接 题意: 有n个电脑1-n,m个连接,由于可能存在一些桥,如果这些桥出现了问题,那么会导致一些电脑之间无法连接,   所以建立链接Q次,每次链接a和b电脑,求链接ab后还存在几个桥:   如果 ...

  9. Mirror--镜像相关错误

    场景: 同一局域网下搭建了镜像的服务器上报以下错误日志: An error occurred in a Service Broker/Database Mirroring transport conn ...

  10. python 定义类 学习1

    此时的d1就是类Dog的实例化对象 实例化,其实就是以Dog类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名 # 定义类模板 class dog(object): # 定义类的方法功能 # ...