burnside引理&polya定理
burnside引理&polya定理
参考资料:
置换:
置换即是将n个元素的染色进行交换,产生一个新的染色方案。
群:
一个元素的集合G与一个二元运算(*)构成一个群。群满足以下性质:
封闭性:\(\forall a,b \in G,\exists c\in G ,c=a*b\)
结合律:\(\forall a,b,c,(a*b)*c=a*(b*c)\)
单位元:\(\exists e\in G,\forall a,a*e=e*a=a\)
逆元:\(\forall a\in G,\exists b\in G,a*b=b*a=e,b=a^{-1}\)
置换群:
即对于置换的集合的群,其中的二元运算为置换的连接,即对一个染色方案置换后的方案进行置换。
burnside引理:
burnside引理用来求在一个置换群的置换集合下本质不同的染色方案数,公式为
\[L=\frac{1}{|G|}\sum_j D(a_j)
\]其中,L表示本质不同的染色方案数,|G|表示置换个数,\(D(a_j)\)表示在\(a_j\)置换下不变的染色方案数。
证明的话,有兴趣的可以自己看看论文,反正我不会证。。。
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定理的更多相关文章
- 置换群 Burnside引理 Pólya定理(Polya)
置换群 设\(N\)表示组合方案集合.如用两种颜色染四个格子,则\(N=\{\{0,0,0,0\},\{0,0,0,1\},\{0,0,1,0\},...,\{1,1,1,1\}\}\),\(|N|= ...
- Burnside引理&Pólya定理
Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...
- 【等价的穿越】Burnside引理&Pólya计数法
Problem 起源: SGU 294 He's Circle 遗憾的是,被吃了. Poj有道类似的: Mission 一个长度为n(1≤n≤24)的环由0,1,2组成,求有多少本质不同的环. 实际上 ...
- 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)
题目来源:UVa 10294 Arif in Dhaka (First Love Part 2) 题意:n颗珠子t种颜色 求有多少种项链和手镯 项链不可以翻转 手镯可以翻转 [分析] 要开始学置换了. ...
- 等价类计数:Burnside引理 & Polya定理
提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...
- 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 ...
- 数学:Burnside引理与Pólya定理
这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...
- @总结 - 12@ burnside引理与pólya定理
目录 @0 - 参考资料@ @1 - 问题引入@ @2 - burnside引理@ @3 - pólya定理@ @4 - pólya定理的生成函数形式@ @0 - 参考资料@ 博客1 @1 - 问题引 ...
- Burnside 引理与 Pólya 定理
群 群的定义 在数学中,群是由一种集合以及一个二元运算所组成的,符合"群公理"的代数结构. 一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算.二元运算用 \(\cdot ...
随机推荐
- 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 ...
- 日志系统实战 AOP静态注入
http://www.cnblogs.com/mushroom/p/3932698.html http://www.cnblogs.com/mushroom/p/4124878.html http:/ ...
- go http 文件下载
package main import ( "fmt" "net/http" "os" ) func DownFile() { userFi ...
- Linux登录失败处理功能
本文要实现的功能:如果有人恶意尝试破解你的服务器密码,那么这个功能就能帮你起到一定的作用,当尝试密码错误超过设定的次数后,就会锁定该账户多长时间(自行设定),时间过后即可自行解锁,这样可以增加攻击者 ...
- 基于JDK1.8的LinkedList源码学习笔记
LinkedList作为一种常用的List,是除了ArrayList之外最有用的List.其同样实现了List接口,但是除此之外它同样实现了Deque接口,而Deque是一个双端队列接口,其继承自Qu ...
- 热词统计以及Quartz.net的简单使用
一.热词统计 方案一: 设计一个表:ID KeyWord Count 当用户再输入框中查询的时候,我们就往表中插入数据,在插入之前首先判断是否已经存在keyword,存在的话,让C ...
- throw and throws in Java
throw and throws in Java - GeeksforGeeks https://www.geeksforgeeks.org/throw-throws-java/ throw and ...
- Network---3694poj(桥与LCA)
题目链接 题意: 有n个电脑1-n,m个连接,由于可能存在一些桥,如果这些桥出现了问题,那么会导致一些电脑之间无法连接, 所以建立链接Q次,每次链接a和b电脑,求链接ab后还存在几个桥: 如果 ...
- Mirror--镜像相关错误
场景: 同一局域网下搭建了镜像的服务器上报以下错误日志: An error occurred in a Service Broker/Database Mirroring transport conn ...
- python 定义类 学习1
此时的d1就是类Dog的实例化对象 实例化,其实就是以Dog类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名 # 定义类模板 class dog(object): # 定义类的方法功能 # ...