Burnside引理

设G是N{1,2,.....,n}上的置换群,G在N上可引出不同的等价类(在置换群中有置换的都等价),其不同的等价类的个数为LL=1/|G|*(c1(a1)+...c1(ai)...+c1(ag))c1表示置换ai作用过后不变的方案数,也就是置换中循环节长度是1的循环个数(N中的元素是组合方案的序号不是自然数!此置换群是关于所有着色图像(所有可能的情况)集合N的置换)Burnside应用关键:如何构造置换群(图形上来说一般为根据中心点,对称轴进行旋转和翻转)缺陷:置换是作用在所有方案上的,如果颜色数量过多,方案随之剧增,Burnside无能为力;

Polya定理

设G是n个对象的一个置换群(此置换群是关于所有被着色对象集合的置换),用m种颜色对这n个对象进行着色,则不同的染色方案数为ll=1/|G|*(m^c(a1)+...m^c(ai)+...m^c(an)) c表示ai置换的循环节数量当着色方案有具体限制条件时一般用Burnside引理而不用Polya定理

Polya定理的母函数形式

设N是n个对象的集合,G是N上的置换群,G={P1,P2,...,Pg},用m种颜色b1,b2,...bm对n个对象进行着色设Ck(P)为置换P中k循环,令Sk=b1^k+b2^k+...+bm^k,k=1,2,...n(Sk为每种颜色允许出现k次),则具体着色方案数的多项式为:P=1/|G|*∑(Pi∈G)(S1^c1(Pi)*S2^c2(Pi)*...*Sn^cn(Pi))展开并合并同类项之后,b1^i1*b2^i2*...*bm^im前的系数即为具体着色方案数。

常用多面体的置换群

正四面体(顶点数:4,棱数:6)

1、以顶点为目标的转动群:以顶点—面心为轴:(1)1  (3)1  8个置换群;以棱中—棱中为轴:(2)2  3个置换群;不动:(1)4  1个置换群;2、以棱为目标的转动群:以顶点—面心为轴:(3)2  8个置换群;以棱中—棱中为轴:(1)2  (2)2  3个置换群;不动:(1)6  1个置换群;3、以面为目标的转动群:以顶点—面心为轴:(1)1  (3)1  8个置换群;以棱中—棱中为轴:(2)2  3个置换群;不动:(1)4 1个置换群;

正六面体(顶点数:8,棱数:12)

1、以顶点为目标的转动群:以顶点—顶点为轴:(1)2  (3)2  8个置换群;以棱中—棱中为轴:(2)4  6个置换群;以面心—面心为轴:(4)2  6个置换群;(2)4  3个置换群;不动:(1)8  1个置换群;2、以棱为目标的转动群:以顶点—顶点为轴:(3)4  8个置换群;以棱中—棱中为轴:(1)2  (2)5  6个置换群;以面心—面心为轴:(4)3  6个置换群;(2)6  3个置换群;不动:(1)12  1个置换群;3、以面为目标的转动群:以顶点—顶点为轴:(3)2  8个置换群;以棱中—棱中为轴:(2)3  6个置换群;以面心—面心为轴:(1)2  (4)1  6个置换群;(1)2  (2)2  3个置换群;不动:(1)6  1个置换群;

正八面体(顶点数:6,棱数:12)

1、以顶点为目标的转动群:以顶点—顶点为轴:(1)2  (4)1  6个置换群;(1)2  (2)2  3个置换群;以棱中—棱中为轴:(2)3  6个置换群;以面心—面心为轴:(3)2  8个置换群;不动:(1)6  1个置换群;
2、以棱为目标的转动群:以顶点—顶点为轴:(4)3  6个置换群;(2)6  3个置换群;以棱中—棱中为轴:(1)2  (2)5  6个置换群;以面心—面心为轴:(3)4  8个置换群;不动:(1)12  1个置换群;
3、以面为目标的转动群:以顶点—顶点为轴:(4)3  6个置换群;(2)6  3个置换群;以棱中—棱中为轴:(2)3  6个置换群;以面心—面心为轴:(1)2  (3)2  8个置换群;不动:(1)8  1个置换群;

足球(顶点数:60,棱数:90;五边形:12;六边形:20)

1、以顶点为目标的转动群:以五边形面心—五边形面心为轴:(5)12  24个置换群;以棱中—棱中为轴:(2)30  15个置换群;以六边形面心—六边形面心为轴:(3)20  20个置换群;不动:(1)60  1个置换群;2、以棱为目标的转动群:以五边形面心——五边形面心为轴:(5)18  24个置换群;以棱中—棱中为轴:(1)2  (2)44  15个置换群;以六边形面心—六边形面心为轴:(3)30  20个置换群;不动:(1)90  1个置换群;

Polya+Burnside引理应用示例

多面体类(以六面体为例)

分析:

首先重要的是要弄清楚正方体的旋转,共24种变换。1、静止不动,那么就是12个循环,每个循环节长度为12、通过两个对立的顶点,分别旋转120,240,有4组顶点,在每一次旋转当中,可以发现分为4个循环,每个循环节长度为3,直观的说,就是有3条边是交换的,颜色必须一样。3、通过两个对立面的中心,分别旋转90,180,270度。有3组面在每次旋转90度和270度的时候,可以发现分为3个循环,每个循环节长度为4在每次旋转180度的时候,可以发现分为6个循环,每个循环节长度为24、通过两条对立的棱的中心,分别旋转180度,有6组棱在每次旋转的时候,分为6个循环,每个循环节长度为2有了以上基础之后,便是对于每一个置换,求出等价的种数。这里通过组合数来确定,以上说了,是将12条边分为若干个循环,每个循环的颜色相同。转换成n个物品放入n个集合的种数。

下面来看代码:

#define N 1000000000
#define inf 1<<29
#define MOD 9973
#define LL long long
int a[7],b[7];
LL c[15][15];
//处理每K条边必须颜色相同
//总共把边分为12/k组
LL slove(int k){int n=0;LL sum=1;for(int i=0;i<6;i++)if(b[i]%k==0){b[i]/=k;n+=b[i];}elsereturn 0;//总共n组,然后通过组合数确定方案数for(int i=0;i<6;i++){sum*=c[n][b[i]];n-=b[i];}return sum;
}
LL still_slove(){memcpy(b,a,sizeof(a));//静止不到,不需要有边相同return slove(1);
}
LL point_slove(){memcpy(b,a,sizeof(a));//有4组顶点,每个轴可以转120以及160度//每组旋转,循环节长度为3,3条边的颜色一样return 4*2*slove(3);
}
LL plane_slove(){//3有组对面,可以旋转90度和270度//每次旋转,要求4条边颜色相同memcpy(b,a,sizeof(a));LL ans=3*2*slove(4);memcpy(b,a,sizeof(a));//3组对面,旋转180度//每次旋转要求两条边颜色相同return ans+3*slove(2);
}
LL edge_slove(){LL ans=0;for(int i=0;i<6;i++)for(int j=0;j<6;j++){//围绕棱旋转,有两条棱是不变的,先除掉memcpy(b,a,sizeof(a));b[i]--;b[j]--;if(b[i]<0||b[j]<0) continue;//6组对棱,每次旋转180度//每次旋转,两条边相同ans+=6*slove(2);}return ans;
}
LL Polya(){LL ans=0;//第一种静止不动ans+=still_slove();//第二种过某顶点以及相对的顶点的轴旋转ans+=point_slove();//第三种过某个面以及相对的面的轴旋转ans+=plane_slove();//第四种过某条棱以及相对的棱为轴旋转ans+=edge_slove();return ans/24;
}
//预处理组合数
void Init(){for(int i=0;i<=12;i++){c[i][0]=c[i][i]=1;for(int j=1;j<i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1]);}
}
int main(){Init();int t,k;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));for(int i=0;i<12;i++){scanf("%d",&k);a[k-1]++;}printf("%lld\n",Polya());}return 0;
}

环类

分析:

置换及循环节数的计算方法:对于有n个位置的手镯,有n种旋转置换和n种翻转置换:对于旋转置换:c(fi) = gcd(n,i)  i为一次转过i颗宝石( i = 0 时 c=n;)对于翻转置换:如果n为偶数:c(f) = n/2 的置换有n/2个;c(f) = n/2+1 的置换有n/2个;如果n为奇数:c(f) = n/2+1.

下面来看代码:

int Gcd(int a,int b){return b?Gcd(b,a%b):a;
}double Polgy(int n){int i;double sum=0,tmp;if(n==0)return 0;//旋转置换的情况for(i=1;i<=n;i++){tmp=Gcd(i,n);sum+=pow(3.0,Gcd(i,n));}//翻转置换的情况if(n%2==0){sum+=pow(3.0,n/2+1)*n/2;sum+=pow(3.0,n/2)*n/2;}else{sum+=pow(3.0,n/2+1)*n;}return sum/2/n;
}int main(){int n;while(cin>>n && n!=-1){cout<<(int)Polgy(n)<<endl;}
}

组合数学常用内容——Polya定理+Burnside引理相关推荐

  1. 置换群,Polya引理和burnside引理(等价类计数问题)

    参考文章: 等价类计数问题 Burnside引理&Pólya定理 Burnside引理与Polya定理 置换群和Burnside引理,Polya定理 概念引入: 离散数学应该学过置换群的相关概 ...

  2. Polya定理,Burnside引理

    涉及到组合数学的问题,首先是群的概念: 设G是一个集合,*是G上的二元运算,如果(G,*)满足下面的条件: 封闭性:对于任何a,b∈G,有a*b∈G; 结合律:对任何a,b,c∈G有(a*b)*c=a ...

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

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

  4. 【组合数学】通俗解释 Burnside引理和Polya定理

    文章目录 前言 Burnside的数学定义: 用例子解释Burnside 用例子解释Polya定理 参考资料 前言 对于图形来说,如果通过旋转,图像能达到其他图像的效果,这叫做本质上一样. Burns ...

  5. ACM_置换群 burnside引理 Polya定理

    置换群也是群论当中一个比较重要的内容,可是在离散课上老师直接跳过了这章内容我也是--(日了dog了),自己看了半天资料总算是有点眉目了. 1.置换群: 首先我们来介绍一下置换,设S为一个n个元素的集合 ...

  6. 群论:Burnside引理与Polya定理

    正题 在数学中,群表示一个拥有满足封闭性.满足结合律.有单位元.有逆元的二元运算的代数结构,包括阿贝尔群. 置换,简单来说就是对元素来进行一种重排列,即 [1,n][1,n][1,n] 映射到 [1, ...

  7. Polya定理与Burnside引理及其应用

    Polya定理及其应用 群与置换群 轮换 PolyaPolyaPolya定理 BurnsideBurnsideBurnside引理 PolyaPolyaPolya定理的简单应用 PolyaPolyaP ...

  8. 【算法讲27:Polya定理】BurnSide 引理 Polya定理 | 洛谷 P4980

    [算法讲27:Polya定理]洛谷 P4980 前置 引入 前置:BurnSideBurnSideBurnSide 引理 Polya 定理 回到题目 代码 注:下文证明都略,只记录重要的性质结论 前置 ...

  9. Burnside引理和Polya定理学习笔记

    前言 求·······的方案数 循环同构算一种 一脸懵逼 (于是我觉得系统的学一遍Burnside引理和Polya定理) 正文 置换 置换的概念 对于一个排列aia_iai​ 我们想成iii输进去会出 ...

最新文章

  1. 一个适合于Python 初学者的入门练手项目
  2. 微信小程序-地图组件(map)的使用
  3. vSphere vSAN 入门
  4. 如何通过改造休闲旅行车赚到1000万元?
  5. 机器学习的训练数据(Training Dataset)、测试数据(Testing Dataset)和验证数据(Validation Dataset)
  6. python canvas画弧度_超清字符画——Python代码
  7. JavaScript学习笔记(四)
  8. 手机内存应该看ROM还是RAM
  9. 64qam带宽计算_烧脑:5G 理论峰值速率是怎么计算的?
  10. 转 android8.0通知栏适配
  11. 【092】召唤神龙-指尖大鱼吃小鱼的魔性游戏
  12. [Unity 代码写法整理]嵌套判断问题(一)
  13. 解决git中upstream丢失问题Your branch is based on 'origin/xxxx', but the upstream is gone.
  14. 苹果x重启方法_iPhone无法开机怎么办?三种快速维修方法
  15. Springboot毕设项目地方特色美食小吃分享平台6iqqq(java+VUE+Mybatis+Maven+Mysql)
  16. 机器学习(ML)中文视频教程
  17. 21年新版kali安装
  18. java 继承、super、this、抽象类
  19. 少儿编程重要吗?数字时代的中小学生是否需要拥有编程这项技能?
  20. 线面积分应该没那么难吧···

热门文章

  1. Python——求解一维热传导
  2. 求解100~200之间的素数
  3. 【C应用】函数指针的一种应用
  4. 1077. 皇宫看守
  5. MYSQL自动备份并发送邮件工具
  6. 车牌识别时应防止车牌上固定螺丝的干扰
  7. 西亚文明的时空概念与历史上的文明形态
  8. 菜鸟android教程
  9. 【Android教程】Android Studio找不到连接的手机完全解决办法
  10. “安居客“住房系统-基于Python-Django前后端分离开发(三)——前后端代码联调