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 ...
随机推荐
- 使用ThreadLocal在线程内部传递数据
最近在项目中使用到了JDK提供的线程池,遇到了在多线程环境下在线程内部共享数据的问题 使用ThreadLocal 来解决线程内部共享数据的问题 定义BO package com.unicom.uclo ...
- 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树
[BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...
- Jmeter中ftp测试下载默认路径及文件
今天在测试一个FTP下载功能接口时,发现根据官方文档下载可以成功,但找不到文件,管方文档的配置图如下: 根据官方文档,自己建立了一个请求如下: 但实际下载成功时却发现找不到文件 原来,奥秘是: 本地文 ...
- org.apache.commons.beanutils.BeanUtils的常见用法
import org.apache.commons.beanutils.BeanUtils BeanUtils1. public static void copyProperty(Object bea ...
- OC开发_Storyboard——绘制和视图
1.绘制 不要调用drawRect.调用setNeedsDisplay相当于告知系统视图需要重绘, 它会去调用drawRect,更新屏外缓冲器 2.UIBezierPath绘制图形, 设置图像op ...
- Linux 使用 常识记忆
1.当系统突然死机需要重启时,打开 命令输入端口,使用快捷键 Shift +Alt +F(1或6)打开 ,然后输入 shutdown -r now 如果提示shutdown need to be ro ...
- Ajax 完整教程(转载)
第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.本文的作者是 ...
- 【node】------mongoose的基本使用------【巷子】
1.安装mongoose npm install mongoose 2.启动数据库 mongod --dbpath d:\data\db 3.引入mongoose模块并连接数据库 const mong ...
- phpcms输出logo下拉实例
{pc:content action=" siteid="$siteid" order="listorder ASC"} {loop $data $k ...
- vitess基础镜像构建流程Centos
以下列出了构建vitess使用的Centos镜像的简单流程,由于较早基础版本是Centos7.2的,重新构建可以基于最新的Centos版本构建 1.基础镜像拉取 #拉取官方版本 docker pull ...