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, ...
随机推荐
- OrzFAng系列–树 解题报告
题目描述 方方方种下了三棵树,两年后,第二棵树长出了n个节点,其中1号节点是根节点. 给定一个n个点的树 支持两种操作 方方方进行m次操作,每个操作为: (1)给出两个数i,x,将第i个节点的子树中, ...
- Leetcode#56 Merge Intervals
原题地址 排序+合并,没啥好说的 第一次尝试C++的lambda表达式,有种写js的感觉,很神奇 c11就支持了lambda表达式,仔细想想,我学C++大概就是在09~10年,c11还没有发布,不得不 ...
- CSS3 3D变换
可以这么说,3D变换是基于三维坐标系的.以下是“盗用”的图 CSS3中的3D变换主要包括以下几个功能函数: 3D位移:包括translateZ()和translate3d(): 3D旋转:包括rota ...
- orbis 链接 .a的问题
orbis-clang.exe :error: no such file or directory : libppfxd_delta.a 这个东西真是见鬼 明明在那里就是说找不到 在依赖里libppf ...
- [百度空间] [note] pointer to member is a POD type
C++03 3.9-10: 1 Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member ty ...
- highchart 导出图片, 显示空白
使用highchart时, 导出的图片会变空白.. 解决方案: 不要加载grid.js
- MySQL杂记
参考资料: w3school SQL 教程 : http://www.w3school.com.cn/sql/index.asp 21分钟 MySQL 入门教程 : http://www.cnblo ...
- HDOJ1050
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- oom日志查看
这通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃.如果检查相关的日志文件(/va ...
- 有关npm rum的3个简洁技巧
[编者按]本文作者为来自 MongoDB 的 NodeJS 工程师 Valeri Karpov.Valeri 专注于维护常见的 Mongoose ODM,是<Professional Angul ...