题目链接: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);
}
}

  

最新文章

  1. jQuery 效果 —— 隐藏和显示
  2. Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘
  3. 利用__index和__newindex实现默认值表、监控表、只读表
  4. Selenium 入门
  5. System.arraycopy方法
  6. (简单) POJ 1502 MPI Maelstrom,Dijkstra。
  7. Linux下利用expect,不用交互模式,直接登陆远程主机
  8. 《天书夜读:从汇编语言到windows内核编程》九 时间与定时器
  9. 【html5】html学习笔记1
  10. SqlSever数据库实践周
  11. vue li click
  12. css 实现 左右div 等高, 同时父级div就是最高的子div的高度
  13. 小强学渲染之Unity Shader编程HelloWorld
  14. Confluence 6 数据库表-杂项(Miscellaneous)
  15. 在Ubuntu中搭建KMS服务器
  16. python之time模块:获取当前时间
  17. centos6中创建软raid方法
  18. 2017.4.28 KVM 内存虚拟化及其实现
  19. Centos下查看和修改网卡Mac地址
  20. Java实例---计算器实例

热门文章

  1. bzoj 1800 暴力枚举
  2. mingw fbx sdk /浮点数精度
  3. POI中设置Excel单元格格式
  4. 将apk安装包安装在Android真机或者模拟器
  5. Oracle NULL 和空值
  6. CSS预处理器实践之Sass、Less大比拼[转]
  7. IO端口和IO内存
  8. Sqli-labs less 39
  9. POJ 2785
  10. HDU 1698 Just a Hook (线段树区间更新)