题目链接:http://www.spoj.com/problems/TRANSP2/

题意:

思路:不妨设a=1,b=2,

我们发现(001,010,100)组成一个置换,(011,110,101)组成一个置换。那么对于同一个置换中元素,设置换大小为x,则需要x-1次交换。因此,我们若找到循环节的个数K,那么答案即为2^(a+b)-K.

a+b个珠子的项链,每个珠子可以用两种颜色涂色,通过每次左移a个珠子得到的相同的视为相同。求不同项链的个数。问题就转化成这个。设g=Gcd(a,a+b),则置换群个数为G=(a+b)/g。其实可以看做有G个珠子,每个珠子可以用2^g种颜色涂色。答案为:

  1. int a,b,Pow[N],phi[N];
  2. int prime[1005],tag[1005],cnt;
  3.  
  4. void init()
  5. {
  6. Pow[0]=1;
  7. int i,j;
  8. for(i=1;i<N;i++) Pow[i]=Pow[i-1]*2%mod;
  9.  
  10. phi[1]=1;
  11. for(i=2;i<N;i++) if(!phi[i]) for(j=i;j<N;j+=i)
  12. {
  13. if(!phi[j]) phi[j]=j;
  14. phi[j]=phi[j]/i*(i-1);
  15. }
  16.  
  17. for(i=1;i<N;i++) phi[i]%=mod;
  18.  
  19. for(i=2;i<=1000;i++) if(!tag[i])
  20. {
  21. prime[cnt++]=i;
  22. for(j=i+i;j<=1000;j+=i) tag[j]=1;
  23. }
  24. }
  25.  
  26. int Gcd(int x,int y)
  27. {
  28. if(y==0) return x;
  29. return Gcd(y,x%y);
  30. }
  31.  
  32. i64 exGcd(int a,int b,i64 &x,i64 &y)
  33. {
  34. if(b==0)
  35. {
  36. x=1;
  37. y=0;
  38. return a;
  39. }
  40. i64 temp=exGcd(b,a%b,x,y);
  41. i64 t=x;
  42. x=y;
  43. y=t-a/b*y;
  44. return temp;
  45. }
  46.  
  47. int p[105],q[105],num;
  48.  
  49. void split(int n)
  50. {
  51. num=0;
  52. int i;
  53. for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++) if(n%prime[i]==0)
  54. {
  55. p[num]=prime[i];
  56. q[num]=0;
  57. while(n%prime[i]==0)
  58. {
  59. q[num]++;
  60. n/=prime[i];
  61. }
  62. num++;
  63. }
  64. if(n>1) p[num]=n,q[num++]=1;
  65. }
  66.  
  67. int ans,m,L;
  68.  
  69. int calPow(int a,int b)
  70. {
  71. int ans=1;
  72. while(b)
  73. {
  74. if(b&1) ans=(i64)ans*a%mod;
  75. a=(i64)a*a%mod;
  76. b>>=1;
  77. }
  78. return ans;
  79. }
  80.  
  81. void cal(int t)
  82. {
  83. int x=L/t;
  84. ans+=(i64)calPow(m,t)*phi[x]%mod;
  85. ans%=mod;
  86. }
  87.  
  88. void DFS(int dep,int t)
  89. {
  90. if(dep==num)
  91. {
  92. cal(t);
  93. return;
  94. }
  95. int i;
  96. for(i=0;i<=q[dep];i++)
  97. {
  98. DFS(dep+1,t);
  99. t*=p[dep];
  100. }
  101. }
  102.  
  103. int main()
  104. {
  105. init();
  106. rush()
  107. {
  108. RD(a,b);
  109. if(!a||!b)
  110. {
  111. puts("0");
  112. continue;
  113. }
  114. b+=a;
  115. int k=Gcd(a,b);
  116. L=b/k;
  117. split(L); ans=0; m=Pow[k];
  118. DFS(0,1);
  119. i64 x,y;
  120. exGcd(L,mod,x,y);
  121. x=(x%mod+mod)%mod;
  122. ans=ans*x%mod;
  123. ans=Pow[b]-ans;
  124. ans=(ans%mod+mod)%mod;
  125. PR(ans);
  126. }
  127. }

  

SPOJ 422 Transposing is Even More Fun(polay计数)的更多相关文章

  1. SPOJ 422 Transposing is Even More Fun ——Burnside引理

    这题目就比较有趣了. 大概题目中介绍了一下计算机的储存方法,给一个$2^a*2^b$的矩阵. 求转置.但是只能交换两个数,求所需要的步数. 首先可以把变化前后的位置写出来,构成了许多的循环.左转将狼踩 ...

  2. 解题:SPOJ 422 Transposing is Even More Fun

    题面 这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=.= 直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节 在一个循环节里的位置有什 ...

  3. Burnside引理和polay计数学习小记

    在组合数学中有这样一类问题,比如用红蓝两种颜色对2*2的格子染色,旋转后相同的算作一种.有多少种不同的染色方案?我们列举出,那么一共有16种.但是我们发现,3,4,5,6是同一种,7,8,9,10是用 ...

  4. 【SPOJ】Transposing is even more fun!

    题意: 给出a.b 表示按先行后列的方式储存矩阵 现在要将其转置 可以交换两个点的位置 求最小操作次数 题解: 储存可以将其视为拉成一条链 设a=5.b=2 则在链上坐标用2^***(a,b)表示为( ...

  5. POJ 2409 Let it Bead(polay计数)

    题目链接:http://poj.org/problem?id=2409 题意:给出一个长度为m的项链,每个珠子可以用n种颜色涂色.翻转和旋转后相同的算作一种.有多少种不同的项链? 思路: (1) 对于 ...

  6. HDU 4633 Who's Aunt Zhang(polay计数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4633 题意:有下面一个魔方.有K种颜色.可以为顶点.边.面(每个面有9个小面)染色.两种染色算作一种当 ...

  7. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

  8. Burnside引理和polay计数 poj2409 Let it Bead

    题目描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ...

  9. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

随机推荐

  1. 聊一聊js中的null、undefined与NaN

    零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...

  2. std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义

    std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...

  3. img图片底部出现莫名的下边距问题

    谷歌中这样是解释的: 图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多. ...

  4. 利用URLRewriter.dll 实现ASP.NET实现伪静态

    大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访 ...

  5. DreamFactory service platform 将DB发布成restful service

    PPT:http://www.slideshare.net/DreamFactorySoftware/angularjs-and-rest-made-simple blog:http://blog.d ...

  6. 几种基于HTTP协议的RPC性能比较

    有了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看出,HessianProxyFactory的create方法就是创建接口Basic的代理类, ...

  7. javascript实现数据结构与算法系列:功能完整的线性链表

    由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...

  8. MYSQL注入天书之宽字节注入

    Background-7 宽字节注入 Less-32,33,34,35,36,37六关全部是针对'和\的过滤,所以我们放在一起来进行讨论. 对宽字节注入的同学应该对这几关的bypass方式应该比较了解 ...

  9. Ruby探针的基本实现原理

    李哲 - MAY 13, 2015 语言本身 Ruby语言支持语法级别的系统,框架,甚至语言本身的方法复写,一般叫做元编程(meta programming), 此基础之上还有一些术语为mixin,方 ...

  10. 【hadoop】有参考价值的博客整理

    好文章的网址: hadoop shuffle机制中针对中间数据的排序过程详解(源代码级) Hadoop mapreduce原理学习 与 Hadoop 对比,如何看待 Spark 技术? 深入理解Had ...