博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 422 Transposing is Even More Fun(polay计数)
阅读量:7232 次
发布时间:2019-06-29

本文共 1269 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

思路:不妨设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
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); }}

  

 

转载于:https://www.cnblogs.com/jianglangcaijin/p/3457446.html

你可能感兴趣的文章
linux .net mono方案测试记录与报告(一)
查看>>
某未被少林寺吞并的小寺庙师徒的经典对话
查看>>
IT兄弟连 JavaWeb教程 JSP内置对象1
查看>>
IT兄弟连 JavaWeb教程 JSP内置对象经典案例
查看>>
XCode环境变量及路径设置 解决头文件找不到的问题
查看>>
[Go]链表的相关知识
查看>>
C# Json数据反序列化为Dictionary并根据关键字获取指定值1
查看>>
jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation"
查看>>
javascript、jquery获取网页的高度和宽度
查看>>
面向对象---代码练习(以车为案例)
查看>>
C#趋势图(highcharts插件)
查看>>
stm32的flash编程
查看>>
java多线程-AbstractQueuedSynchronizer
查看>>
苹果新的编程语言 Swift 语言进阶(十四)--扩展
查看>>
Md5加密方法
查看>>
转:zookeeper中Watcher和Notifications
查看>>
函数的参数
查看>>
Java编程规范
查看>>
【洛谷 P1070】道路游戏 (DP)
查看>>
走迷宫(回溯、深搜)判断能否到终点
查看>>