题面

这题虽然很老了但是挺好的

仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案。

思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的路径计数问题,这里可以多矩乘一次然后统计对角线,即强行让它走回一开始的珠子,比较方便

注:这代码T了,我不想卡了,但是复杂度和正确性没问题,请根据自己的情况食用

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int mod=;
  6. int T,n,m,k,t1,t2,mapp[][];
  7. struct a
  8. {
  9. int mat[][];
  10. void Clean()
  11. {
  12. memset(mat,,sizeof mat);
  13. }
  14. void Init()
  15. {
  16. for(int i=;i<=m;i++)
  17. for(int j=;j<=m;j++)
  18. mat[i][j]=mapp[i][j];
  19. }
  20. };
  21. a Matime(a x,a y)
  22. {
  23. a ret; ret.Clean();
  24. for(int i=;i<=m;i++)
  25. for(int k=;k<=m;k++)
  26. for(int j=;j<=m;j++)
  27. ret.mat[i][j]+=x.mat[i][k]*y.mat[k][j]%mod,ret.mat[i][j]%=mod;
  28. return ret;
  29. }
  30. a Maqpow(a x,int k)
  31. {
  32. if(k==) return x;
  33. a tmp=Maqpow(x,k/);
  34. return k%?Matime(x,Matime(tmp,tmp)):Matime(tmp,tmp);
  35. }
  36. int Calc(int x)
  37. {
  38. a cal; int ret=;
  39. cal.Init(),cal=Maqpow(cal,x);
  40. for(int i=;i<=m;i++)
  41. ret+=cal.mat[i][i],ret%=mod;
  42. return ret;
  43. }
  44. int Phi(int x)
  45. {
  46. int ret=x;
  47. for(int i=;i*i<=x;i++)
  48. if(x%i==)
  49. {
  50. ret/=i,ret*=i-;
  51. while(x%i==) x/=i;
  52. }
  53. if(x!=) ret/=x,ret*=x-;
  54. return ret;
  55. }
  56. void exGCD(int a,int b,int &x,int &y)
  57. {
  58. if(!b) x=,y=;
  59. else exGCD(b,a%b,y,x),y-=a/b*x;
  60. }
  61. int Inv(int x)
  62. {
  63. int xx,yy;
  64. exGCD(x,mod,xx,yy);
  65. return (xx%mod+mod)%mod;
  66. }
  67. int Solve(int x)
  68. {
  69. int ret=;
  70. for(int i=;i*i<=x;i++)
  71. if(x%i==)
  72. {
  73. ret+=Phi(x/i)*Calc(i)%mod,ret%=mod;
  74. if(i*i!=x) ret+=Phi(i)*Calc(x/i)%mod,ret%=mod;
  75. }
  76. return ret*Inv(x)%mod;
  77. }
  78. int main()
  79. {
  80. scanf("%d",&T);
  81. while(T--)
  82. {
  83. scanf("%d%d%d",&n,&m,&k);
  84. for(int i=;i<=m;i++)
  85. for(int j=;j<=m;j++)
  86. mapp[i][j]=;
  87. for(int i=;i<=k;i++)
  88. {
  89. scanf("%d%d",&t1,&t2);
  90. mapp[t1][t2]=mapp[t2][t1]=;
  91. }
  92. printf("%d\n",Solve(n));
  93. }
  94. return ;
  95. }

解题:POJ 2888 Magic Bracelet的更多相关文章

  1. poj 2888 Magic Bracelet(Polya+矩阵快速幂)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 4990   Accepted: 1610 D ...

  2. POJ 2888 Magic Bracelet(Burnside引理,矩阵优化)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 3731   Accepted: 1227 D ...

  3. poj 2888 Magic Bracelet <polya定理>

    题目:http://poj.org/problem?id=2888 题意:给定n(n <= 10^9)颗珠子,组成一串项链,每颗珠子可以用m种颜色中一种来涂色,如果两种涂色方法通过旋转项链可以得 ...

  4. poj 2888 Magic Bracelet

    经典的有限制条件的Burnside计数+矩阵乘法!!! 对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子, 那么array[ ...

  5. POJ 2888 Magic Bracelet(burnside引理+矩阵)

    题意:一个长度为n的项链,m种颜色染色每个珠子.一些限制给出有些颜色珠子不能相邻.旋转后相同视为相同.有多少种不同的项链? 思路:这题有点综合,首先,我们对于每个n的因数i,都考虑这个因数i下的不变置 ...

  6. POJ 2888 Magic Bracelet [Polya 矩阵乘法]

    传送门 题意:竟然扯到哈利波特了.... 和上一题差不多,但颜色数很少,给出不能相邻的颜色对 可以相邻的连边建图矩阵乘法求回路个数就得到$f(i)$了.... 感觉这样的环上有限制问题挺套路的...旋 ...

  7. POJ 2888 Magic Bracelet ——Burnside引理

    [题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...

  8. [POJ 2888]Magic Bracelet[Polya Burnside 置换 矩阵]

    也许更好的阅读体验 \(\mathcal{Description}\) 大意:给一条长度为\(n\)的项链,有\(m\)种颜色,另有\(k\)条限制,每条限制为不允许\(x,y\)颜色连在一起.要求有 ...

  9. 【POJ2888】Magic Bracelet Burnside引理+欧拉函数+矩阵乘法

    [POJ2888]Magic Bracelet 题意:一个长度为n的项链,有m种颜色的珠子,有k个限制(a,b)表示颜色为a的珠子和颜色为b的珠子不能相邻,求用m种珠子能串成的项链有多少种.如果一个项 ...

随机推荐

  1. DotNetCore部署(IIS)踩坑记

    一.windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法 错误现象如图 因为 ...

  2. CS50.4

    1, PDF,portable document format 便携式文档格式 2, 关于文本编辑器(文字编辑器)和文档编辑器(文字处理器),前者可用来写程序的源代码?名字挺难分辨的. *3, “-o ...

  3. jqGrid 列内容超过一定长度省略表示

    jqgrid初始化方法中的,对应列添加formatter方法 colNames : [ "描述" ], colModel : [ { name : 'description', i ...

  4. python+Selenium 环境搭建

    一.下载相关软件 1.python http://python.org/getit/ 2.setuptools http://pypi.python.org/pypi/setuptools 3.pip ...

  5. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  6. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. Linux第七周学习总结——可执行程序的装载

    Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  8. Linux内核分析第四周总结

    用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...

  9. c# WndProc事件 消息类型

    转载:https://www.cnblogs.com/idben/p/3783997.html WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_D ...

  10. 冲刺Two之站立会议2

    今天我们进行了主界面部分的设置,因为它包含的部分有很多,所以就只能它拆分进行一一突破.今天主要完成了主界面的框架搭建,以及添加了需要的按钮,包括好友管理,退出登录,开启聊天通信界面的内容等.