【群论】专题总结
被群论虐了一个星期 终于大概掌握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的置换