这里就算是一个小总结吧…

附参考的网址:

http://blog.sina.com.cn/s/blog_6a46cc3f0100s2qf.html

http://www.cnblogs.com/hankers/archive/2012/08/03/2622231.html

首先

Burnside引理:

Burnside引理:即互异状态个数等于各种转换下的等价类个数的和除以转换个数。

说人话: 按照这种 转法 转完了还是一样的个数除以转法数

举例:2*2的正方形 2种颜色染色 求不同的方案数

转法: 4种 0° 90° 270° 180°

0° 转完了 都一样吧.. (不就是不转嘛..) 2^4种

90° 和 270° 只有这两个转完了 一样



180° 4种 (如下图 图丑莫怪)



所以一共有 4种转法 和是16+2+2+4=24 本质不同的方案数 就是24/4=6个 大功告成

(证明看论文吧… 我叙述不清..http://www.docin.com/p-296856499.html

蓝后 是 Polya

Polya就是Burnside的加强版 (不过适用性稍差 但是用起来极其方便)

Polya是这个样子的



说人话系列:



还拿2*2的方格说事吧..

我们已经知道了 有4种转法 分别是 0° 90° 270° 180°

循环个数 就是 你这几块 必须染同一个颜色

0° 不用说了吧 循环节 都是1 循环节个数 是4 所以方案数 是2^4=16

90°

这4块 都需要染一个颜色的 才能完全相同 所以循环节个数是1

2^1=2

270°同理

180°

诶 我们发现只要对角染同一个颜色即可



转完还是一样的

所以 循环节个数 是2 循环节大小 都是2 2^2=4

最后再这么一加 搞定~

光这么说 看起来 很麻烦 还不如直接一个一个数呢

那我来出(copy)一道题

HOJ 2084 The Colored Cubes

http://acm.hit.edu.cn/hoj/problem/view?id=2084

题意:用n种颜色为正六面体染色,求有多少种不同的情况。

思路:



我写得可能不太详细,,,详细解释一下..

首先 面-面中心 90 180 270 三种情况

90 &270的时候 是



这个样子的 上面 和 底下 循环节长度为1 中间必须染同样的颜色 循环节长度为4

所以一共是三个循环节

180度 的时候 是 前后一样 左右一样 上 下 可以不同 所以 是4个循环节 长度分别为2,2,2,2

棱 棱 中心 是这个样子的



假设 是两个用咖啡色标成的棱为中心 上 和后一样 前和下一样 左和右一样

三个循环 循环节长度都是2

最后 是点-点中心



与顶点相邻的三个边 必须要染成一样的颜色 所以 循环节个数是2 循环节长度是3

(注意有两种循环的方式 120和 240)所以点点中心的总方案数是4*2=8种

再加上不动置换 除一下总 转法就好啦~

Code 大概长这样…

  1. //By SirisuRen
  2. #include <cstdio>
  3. using namespace std;
  4. long long n;
  5. int main(){
  6. while(scanf("%lld",&n)&&n)
  7. printf("%lld\n",(n*n*n*n*n*n+3*n*n*n*n+12*n*n*n+8*n*n)/24);
  8. }

现在知道Polya的奇妙了吧。。

(某小明同学不服 他暴搜+打表找到了规律)

再来个这个

HOJ 2647 给12面体 染色

小明同学晕倒

但是我不怂啊

还是按照上题一样分析

我们观察得 每个面都是五边形

1. 面面 上下两个面 可以不同 与上下两个面相接的那两层可以不同

所以 循环节有4个 可以转 72° 144° 216° 288° 所以有6*4种转的方法

2. 棱棱 通过一通乱数 可以得到循环节有6个 (我实在不知道怎么描述了) 15种

3. 点点 循环节有4个 20种

4. 不动置换

代码很简单…

是这样子的..

  1. //By SirisuRen
  2. #include <cstdio>
  3. using namespace std;
  4. long long n;
  5. int main(){
  6. while(~scanf("%lld",&n))
  7. printf("%lld\n",(n*n*n*n*n*n*n*n*n*n*n*n+15*n*n*n*n*n*n+44*n*n*n*n)/60);
  8. }

上面的都还是小case (考试才不可能考这玩意呢)

POJ 2409

  1. //By SiriusRen
  2. #include <cstdio>
  3. using namespace std;
  4. int n,m;
  5. int gcd(int a,int b){return b?gcd(b,a%b):a;}
  6. int pow(int x,int y){
  7. int res=x,ans=1;
  8. while(y){
  9. if(y&1)ans=ans*res;
  10. res=res*res;
  11. y>>=1;
  12. }return ans;
  13. }
  14. int main(){
  15. while(scanf("%d%d",&n,&m)&&(n||m)){
  16. int ans=0;
  17. for(int i=1;i<=m;i++)ans+=pow(n,gcd(i,m));
  18. if(m&1)ans+=m*pow(n,m/2+1);
  19. else ans+=m/2*(pow(n,m/2+1)+pow(n,m/2));
  20. ans/=2*m;
  21. printf("%d\n",ans);
  22. }
  23. }

POJ 1286

  1. //By SiriusRen
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. int n;
  7. typedef long long ll;
  8. int main(){
  9. while(~scanf("%d",&n)&&n>=0){
  10. if(n==0){puts("0");continue;}
  11. ll ans=0;
  12. for(int i=1;i<=n;i++)ans+=pow(3,__gcd(i,n));
  13. if(n&1)ans+=n*pow(3,n/2+1);
  14. else ans+=n/2*(pow(3,n/2+1)+pow(3,n/2));
  15. printf("%lld\n",ans/2/n);
  16. }
  17. }

Hdu1812 懒得写高精了.. 用long long 测了几个小数据对了(就不放程序了)

TJU 2795 http://acm.tju.edu.cn/toj/showp2795.html 又要高精

对于高精我是拒绝的 就没写

UVA 11255 long long 可以水的..# Problem Verdict Language Run Time Submission Date

18804966 11255 Necklace Accepted C++ 0.000 2017-02-19 10:15:34

(UVA怎么看自己交的代码啊啊啊 算了我放一份题解吧)

http://blog.csdn.net/overload1997/article/details/53055361

POJ 2154

  1. //By SiriusRen
  2. #include <cstdio>
  3. using namespace std;
  4. bool vis[35050];
  5. int pri[35050],phi[35050],tot,n,p,cases;
  6. void getphi(){
  7. phi[1]=1;
  8. for(int i=2;i<=35000;i++){
  9. if(!vis[i])pri[++tot]=i,phi[i]=i-1;
  10. for(int j=1;j<=tot&&i*pri[j]<=35000;j++){
  11. vis[i*pri[j]]=1,phi[i*pri[j]]=phi[i]*(pri[j]-1);
  12. if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}
  13. }
  14. }
  15. }
  16. int pow(int x,int y){
  17. int ans=1,res=x%p;
  18. while(y){
  19. if(y&1)ans=ans*res%p;
  20. res=res*res%p;
  21. y>>=1;
  22. }return ans;
  23. }
  24. int Phi(int x){
  25. if(x<35000)return phi[x]%p;
  26. int res=x;
  27. for(int i=1;i<=tot&&pri[i]*pri[i]<=x;i++)
  28. if(!(x%pri[i])){
  29. res-=res/pri[i];
  30. while(x%pri[i]==0)x=x/pri[i];
  31. }
  32. if(x>1)res-=res/x;
  33. return res%p;
  34. }
  35. int main(){
  36. getphi();
  37. scanf("%d",&cases);
  38. while(cases--){
  39. scanf("%d%d",&n,&p);
  40. int ans=0;
  41. for(int i=1;i*i<=n;i++)if(!(n%i)){
  42. if(i*i==n){ans=(ans+Phi(i)*pow(n,i-1))%p;break;}
  43. ans=(ans+Phi(n/i)*pow(n,i-1)+pow(n,n/i-1)*Phi(i))%p;
  44. }
  45. printf("%d\n",ans);
  46. }
  47. }

POJ 2888

(有秦神的题解 冰封寒月 sina)woc高一9月份写这题…OTZ

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int cases,n,m,k,mod=9973,phi[35005],p[35005],vis[35005],tot,xx,yy,ans;
  6. struct Matrix{int a[11][11];void init(){memset(a,0,sizeof(a));}}fst;
  7. Matrix operator*(Matrix a,Matrix b){
  8. Matrix c;c.init();
  9. for(int i=1;i<=m;i++)
  10. for(int j=1;j<=m;j++){
  11. for(int k=1;k<=m;k++)
  12. c.a[i][j]+=a.a[i][k]*b.a[k][j];
  13. c.a[i][j]%=mod;
  14. }
  15. return c;
  16. }
  17. Matrix pow(Matrix a,int b){
  18. Matrix c;c.init();
  19. for(int i=1;i<=m;i++)c.a[i][i]=1;
  20. while(b){
  21. if(b&1)c=c*a;
  22. a=a*a;
  23. b>>=1;
  24. }return c;
  25. }
  26. void getphi(){
  27. phi[1]=1;
  28. for(int i=2;i<=35000;i++){
  29. if(!vis[i])p[++tot]=i,phi[i]=i-1;
  30. for(int j=1;j<=tot&&i*p[j]<=35000;j++){
  31. vis[i*p[j]]=1,phi[i*p[j]]=phi[i]*(p[j]-1);
  32. if(!(i%p[j])){phi[i*p[j]]=phi[i]*p[j];break;}
  33. }
  34. }
  35. }
  36. int Phi(int x){
  37. if(x<=35000)return phi[x]%mod;
  38. int res=x;
  39. for(int i=1;i<=tot&&p[i]*p[i]<=x;i++){
  40. if(!(x%p[i])){
  41. res-=res/p[i];
  42. while(!(x%p[i]))x/=p[i];
  43. }
  44. }
  45. if(x>1)res-=res/x;
  46. return res%mod;
  47. }
  48. int calc(int x){
  49. Matrix tmp=pow(fst,x);
  50. int temp=0;
  51. for(int i=1;i<=m;i++)temp+=tmp.a[i][i];
  52. return temp%mod;
  53. }
  54. int pow(int x,int y){
  55. int tmp=1;x%=mod;
  56. while(y){
  57. if(y&1)tmp=tmp*x%mod;
  58. x=x*x%mod;
  59. y>>=1;
  60. }return tmp;
  61. }
  62. int main(){
  63. scanf("%d",&cases);
  64. getphi();
  65. while(cases--){
  66. scanf("%d%d%d",&n,&m,&k),ans=0;
  67. for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)fst.a[i][j]=1;
  68. for(int i=1;i<=k;i++){
  69. scanf("%d%d",&xx,&yy);
  70. fst.a[xx][yy]=fst.a[yy][xx]=0;
  71. }
  72. for(int i=1;i*i<=n;i++){
  73. if(i*i==n)ans=(ans+calc(i)*phi[i])%mod;
  74. if(!(n%i))ans=(ans+calc(i)*Phi(n/i)+calc(n/i)*phi[i])%mod;
  75. }
  76. printf("%d\n",ans*pow(n,mod-2)%mod);
  77. }
  78. }

TJU 3352

嘴巴AC一下

首先 n 和k 都很大 10^9的 线性肯定是不行滴

先想线性怎么做

dp[i]表示循环节长度为i有多少种方案

dp[i]=k*(k-1)^(i-1)-dp[i-1];

诶? woc ? 可以矩阵乘法优化

构造一个转移矩阵

dp[i] 常数

-1   0

1   k-1

2*2的

嘿嘿 然后就无聊了 搞个phi 筛一筛 算一算 判一判 嘴巴搞定~

Burnside&Polya总结的更多相关文章

  1. POJ burnside&&polya整理练习

    POJ 2409 Let it Bead 这题就是polya公式的直接套用,唯一麻烦的是置换群的种类数,由于可以翻转,所以除了要加上pow(c,gcd(s,i))这些平面旋转的置换群,还要加上翻转的. ...

  2. burnside+polya 整理

    先定义几个含义和符号:起始状态/方法/位置/元素/:以染色为例,起始状态是所有的染色方案,方法是以起始状态所有染色方案为基准转变为新的染色情景的操作(如旋转),位置则必须是没有任何染色效果的抽象空间, ...

  3. Burnside&Polya

    以前只是直接用了这两个式子..今天才仔细看了证明..[网上的真是难懂啊 我看的几个博客地址(各有优缺): 其实如果能懂的话 只看博客B就可以了 首先是一些置换群方面的定义和性质  博客A:http:/ ...

  4. Burnside&Polya总结

    这里就算是一个小总结吧- 附参考的网址: http://blog.sina.com.cn/s/blog_6a46cc3f0100s2qf.html http://www.cnblogs.com/han ...

  5. bzoj1004 [HNOI2008]Cards【Burnside/Polya】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 一道好题,但并不是好在融合了三个“考点”(计数,背包dp,逆元),其实背包dp以及求逆 ...

  6. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  7. 【BZOJ】【1004】【HNOI2008】Cards

    Burnside/Polya+背包DP 这道题目是等价类计数裸题吧……>_> 题解:http://m.blog.csdn.net/blog/njlcazl_11109/8316340 啊其 ...

  8. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  9. 各种注意事项(还有c++的一些操作)

    转c++时间: 2017年8月9号 1.记得打头文件 2.=与==的区别(赋值|比较) 3.各种运算符的比较级(与Pascal不同),主要是==与位运算 *4.在OJ上scanf和printf时间优于 ...

随机推荐

  1. element-ui Cascader 级联选择器示例

    <html> <head>test</head> <style> @import url("http://unpkg.com/element- ...

  2. redis启动出错 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error解决办法

    windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1: ...

  3. DB2常用运维命令

    DB2是IBM公司推出关系型数据库管理系统.主要应用于银行.医院等大型机构.现今DB2主要包含以下三个系列:DB2 for Linux, UNIX and Windows(LUW) . DB2在Lin ...

  4. Xpath--使用Xpath爬取糗事百科成人版图片

    #!usr/bin/env python#-*- coding:utf-8 _*-"""@author:Hurrican@file: 爬取糗事百科.py@time: 20 ...

  5. hibernate注解--@transient

    @transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Bas ...

  6. WEBGL学习【八】模型视图投影矩阵

    <!--探讨WEBGL中不同图形的绘制方法:[待测试2017.11.6]--> <!DOCTYPE HTML> <html lang="en"> ...

  7. UVA1585 - Score(紫书习题3.1)

    如何计算你们的得分呢?,如"OOXXOXXOOO". "O"表示问题的正确答案,"X"表示错误的答案.那么它得分是由它自己和它刚刚以前连续的 ...

  8. 把SQLAlchemy查询对象转换成字典/json使用(分开)

    注:针对的是查询出来的是单条对象 多个对象的话可以使用for循环遍历查询出来的对象列表,也可以使用下面的方法 1.config.py文件 #!/usr/bin/env python #-*- codi ...

  9. centos7把编译安装的服务通过systemctl管理

    nginx编译安装的目录是/usr/local/nginx nginx配置文件是/usr/local/nginx/conf/nginx.conf systemctl管理的服务文件在/usr/lib/s ...

  10. Cocos2d切换场景出现的问题-error C2653: “***”不是类或命名空间名称

    1,在开头引入头文件 2,在要引入的头文件中,去除以下代码: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #endif ...