SPOJ 422 Transposing is Even More Fun(polay计数)
题目链接: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种颜色涂色。答案为:
- int a,b,Pow[N],phi[N];
- int prime[1005],tag[1005],cnt;
- void init()
- {
- Pow[0]=1;
- int i,j;
- for(i=1;i<N;i++) Pow[i]=Pow[i-1]*2%mod;
- phi[1]=1;
- for(i=2;i<N;i++) if(!phi[i]) for(j=i;j<N;j+=i)
- {
- if(!phi[j]) phi[j]=j;
- phi[j]=phi[j]/i*(i-1);
- }
- for(i=1;i<N;i++) phi[i]%=mod;
- for(i=2;i<=1000;i++) if(!tag[i])
- {
- prime[cnt++]=i;
- for(j=i+i;j<=1000;j+=i) tag[j]=1;
- }
- }
- int Gcd(int x,int y)
- {
- if(y==0) return x;
- return Gcd(y,x%y);
- }
- i64 exGcd(int a,int b,i64 &x,i64 &y)
- {
- if(b==0)
- {
- x=1;
- y=0;
- return a;
- }
- i64 temp=exGcd(b,a%b,x,y);
- i64 t=x;
- x=y;
- y=t-a/b*y;
- return temp;
- }
- int p[105],q[105],num;
- void split(int n)
- {
- num=0;
- int i;
- for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++) if(n%prime[i]==0)
- {
- p[num]=prime[i];
- q[num]=0;
- while(n%prime[i]==0)
- {
- q[num]++;
- n/=prime[i];
- }
- num++;
- }
- if(n>1) p[num]=n,q[num++]=1;
- }
- int ans,m,L;
- int calPow(int a,int b)
- {
- int ans=1;
- while(b)
- {
- if(b&1) ans=(i64)ans*a%mod;
- a=(i64)a*a%mod;
- b>>=1;
- }
- return ans;
- }
- void cal(int t)
- {
- int x=L/t;
- ans+=(i64)calPow(m,t)*phi[x]%mod;
- ans%=mod;
- }
- void DFS(int dep,int t)
- {
- if(dep==num)
- {
- cal(t);
- return;
- }
- int i;
- for(i=0;i<=q[dep];i++)
- {
- DFS(dep+1,t);
- t*=p[dep];
- }
- }
- int main()
- {
- init();
- rush()
- {
- RD(a,b);
- if(!a||!b)
- {
- puts("0");
- continue;
- }
- b+=a;
- int k=Gcd(a,b);
- L=b/k;
- split(L); ans=0; m=Pow[k];
- DFS(0,1);
- i64 x,y;
- exGcd(L,mod,x,y);
- x=(x%mod+mod)%mod;
- ans=ans*x%mod;
- ans=Pow[b]-ans;
- ans=(ans%mod+mod)%mod;
- PR(ans);
- }
- }
SPOJ 422 Transposing is Even More Fun(polay计数)的更多相关文章
- SPOJ 422 Transposing is Even More Fun ——Burnside引理
这题目就比较有趣了. 大概题目中介绍了一下计算机的储存方法,给一个$2^a*2^b$的矩阵. 求转置.但是只能交换两个数,求所需要的步数. 首先可以把变化前后的位置写出来,构成了许多的循环.左转将狼踩 ...
- 解题:SPOJ 422 Transposing is Even More Fun
题面 这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=.= 直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节 在一个循环节里的位置有什 ...
- Burnside引理和polay计数学习小记
在组合数学中有这样一类问题,比如用红蓝两种颜色对2*2的格子染色,旋转后相同的算作一种.有多少种不同的染色方案?我们列举出,那么一共有16种.但是我们发现,3,4,5,6是同一种,7,8,9,10是用 ...
- 【SPOJ】Transposing is even more fun!
题意: 给出a.b 表示按先行后列的方式储存矩阵 现在要将其转置 可以交换两个点的位置 求最小操作次数 题解: 储存可以将其视为拉成一条链 设a=5.b=2 则在链上坐标用2^***(a,b)表示为( ...
- POJ 2409 Let it Bead(polay计数)
题目链接:http://poj.org/problem?id=2409 题意:给出一个长度为m的项链,每个珠子可以用n种颜色涂色.翻转和旋转后相同的算作一种.有多少种不同的项链? 思路: (1) 对于 ...
- HDU 4633 Who's Aunt Zhang(polay计数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4633 题意:有下面一个魔方.有K种颜色.可以为顶点.边.面(每个面有9个小面)染色.两种染色算作一种当 ...
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- Burnside引理和polay计数 poj2409 Let it Bead
题目描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ...
- polay计数原理
公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...
随机推荐
- 聊一聊js中的null、undefined与NaN
零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...
- std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...
- img图片底部出现莫名的下边距问题
谷歌中这样是解释的: 图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多. ...
- 利用URLRewriter.dll 实现ASP.NET实现伪静态
大家一定经常在网络上看到很多网站的地址后缀都是用XX.HTML或者XX.ASPX等类似静态文件的标示来操作的吧,那么大家有怀疑过他真的是一个一个的静态生成的文件么,静态文件的生成的优缺有好有坏,对于访 ...
- DreamFactory service platform 将DB发布成restful service
PPT:http://www.slideshare.net/DreamFactorySoftware/angularjs-and-rest-made-simple blog:http://blog.d ...
- 几种基于HTTP协议的RPC性能比较
有了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看出,HessianProxyFactory的create方法就是创建接口Basic的代理类, ...
- javascript实现数据结构与算法系列:功能完整的线性链表
由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...
- MYSQL注入天书之宽字节注入
Background-7 宽字节注入 Less-32,33,34,35,36,37六关全部是针对'和\的过滤,所以我们放在一起来进行讨论. 对宽字节注入的同学应该对这几关的bypass方式应该比较了解 ...
- Ruby探针的基本实现原理
李哲 - MAY 13, 2015 语言本身 Ruby语言支持语法级别的系统,框架,甚至语言本身的方法复写,一般叫做元编程(meta programming), 此基础之上还有一些术语为mixin,方 ...
- 【hadoop】有参考价值的博客整理
好文章的网址: hadoop shuffle机制中针对中间数据的排序过程详解(源代码级) Hadoop mapreduce原理学习 与 Hadoop 对比,如何看待 Spark 技术? 深入理解Had ...