zoukankan      html  css  js  c++  java
  • 【群论】专题总结

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

  • 相关阅读:
    fastjson-alibaba
    ubuntu 入门
    资料文档
    asp.net mvc View视图相关
    视频
    js第三方
    工具类网址
    [转]初学者的编程自学指南
    seajs的使用--主要了解模块化
    其它
  • 原文地址:https://www.cnblogs.com/g-word/p/3729342.html
Copyright © 2011-2022 走看看