【群论】专题总结

被群论虐了一个星期 终于大概掌握Burnside和Polya了

我竟然在去年曾经会过Burnside还写过两篇题解orz

果然光写题解还是不够- - so写个专题总结

 

先贴个网址 我的群论的题目都是在这找的:

http://www.cnblogs.com/jianglangcaijin/category/536278.html

Burnside和Polya主要是用来计算对某东西染色 本质不同的方案数

题目一般会给出什么情况算本质相同

如旋转若干次后相同 或翻转后相同

 

置换

置换一般由题目给出 即什么情况下算本质相同

常见置换有

旋转相同:置换为所有元素右移1..n格

翻转相同:奇偶分类讨论 以不同直线为对称轴翻转

 

Burnside引理

定义c1(Pk)为在置换Pk下的不动点的个数(这里的点表示某一种染色方案)

即某种状态经过Pk置换后得到的还是自己

则本质不同方案数为ans=Σ(c1(Pk))/|G| (|G|为置换个数)

 

Polya定理

我们发现Burnside不仅麻烦 需要枚举每种状态 而且在很多情况下时间不支持枚举所有状态

于是有了Polya

Polya其实就是Burnside的一个优化 它能较快地算出Σ(c1(Pk))的值

对于某个置换Pk 它有C(Pk)个轮换 显然如果某状态经过这个置换不动 它同一个轮换的点的颜色一定要相同

则这种状态有m^C(Pk)个(m为颜色数)

所以答案就是ans=Σ(m^C(Pk))/|G|

但是Polya有一个缺点 它能计算的范围比Burnside要小

它不能计算对于不同点能染的颜色不一样的题目

 

优化

用暴力的方法计算某置换的轮换个数时间是O(n) 很多题目的置换个数也是O(n)的

如果遇到AC大神那把n开到10^9的就玩脱了 所以写几个常见的优化

旋转相同

  右移i次的置换的轮换个数为gcd(n,i) 这样就能logn求出轮换个数

  其中gcd的值等于gcd(n,i)的置换有phi(n/i)个

  这样只要O((n)log(n))就能计算出答案

翻转相同
  当n为奇数 有n个轮换个数为n/2+1的置换
  当n为偶数 有n/2个轮换个数为n/2+1的置换 和n/2个轮换个数为n/2的置换

你可能感兴趣的:(总结)