博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解题:SPOJ 422 Transposing is Even More Fun
阅读量:5060 次
发布时间:2019-06-12

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

这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=。=

直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节

在一个循环节里的位置有什么特征?用二进制表示位置,那么他们的位置可以通过循环左移a位/循环右移b位互相表示,然后问题就变成了:在左移a位/右移b位的置换群作用下,在a+b个01构成的环里找等价类。仍然不好做,因为现在直接Burnside做不出来,Polya又还没法做,继续转换

我们把每$gcd(a,b)$个数缩成一个,也就是转成$\frac{(a+b)}{gcd(a,b)}$个环数等价类。这样的好处是旋转都变成了1位,然后套上Polya就可以了,大概需要卡一卡常?

1 #include
2 #include
3 #include
4 using namespace std; 5 const int N=1e6+60,mod=1e6+3; 6 int T,a,b,cnt,c1,c2,pwe[10],prf[10]; 7 int pw[N],npr[N],pri[N],mind[N],fac[N],fai[N]; 8 int GCD(int a,int b) 9 {10 return b?GCD(b,a%b):a;11 }12 void Add(int &x,int y)13 {14 x+=y;15 if(x>=mod) x-=mod;16 }17 int Qpow(int x,int k)18 {19 if(k==1) return x;20 int tmp=Qpow(x,k/2);21 return k%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;22 }23 void Pre()24 {25 npr[1]=true,mind[1]=1;26 for(int i=2;i<=1000000;i++)27 {28 if(!npr[i]) pri[++cnt]=i,mind[i]=i;29 for(int j=1,k;j<=cnt&&(k=i*pri[j])<=1000000;j++)30 {31 npr[k]=true,mind[k]=pri[j];32 if(i%pri[j]==0) break;33 }34 }35 pw[0]=1;36 for(int i=1;i<=1000000;i++)37 pw[i]=pw[i-1]*2%mod;38 }39 void DFS(int idx,int num,int phi)40 {41 if(idx>c2)42 fac[++c1]=num,fai[num]=phi;43 else44 {45 int pr=prf[idx];46 DFS(idx+1,num,phi);47 DFS(idx+1,num*=pr,phi*=pr-1);48 for(int i=2;i<=pwe[idx];i++)49 DFS(idx+1,num*=pr,phi*=pr);50 }51 }52 void Decompose(int x)53 {54 if(x==1)55 fac[c1=1]=1;56 else57 {58 c2=0;59 while(x!=1)60 {61 prf[++c2]=mind[x],pwe[c2]=0;62 while(x%prf[c2]==0) x/=prf[c2],pwe[c2]++;63 }64 c1=0,DFS(1,1,1);65 }66 }67 int Query(int len,int col)68 {69 int ret=0;70 Decompose(len);71 for(int i=1;i<=c1;i++)72 Add(ret,1ll*fai[len/fac[i]]*Qpow(col,fac[i])%mod);73 return 1ll*ret*Qpow(len,mod-2)%mod;74 }75 int main()76 {77 Pre();78 scanf("%d",&T);79 while(T--)80 {81 scanf("%d%d",&a,&b);82 if(!a||!b) puts("0");83 else84 {85 int g=GCD(a,b);86 printf("%d\n",(pw[a+b]-Query((a+b)/g,pw[g])+mod)%mod);87 }88 }89 return 0;90 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10433597.html

你可能感兴趣的文章
Sql FAQ
查看>>
【Android】冷门常用 ADB
查看>>
知识分子真正的悲哀是依附强权放弃说理
查看>>
优秀简历要遵循哪些规则
查看>>
Grow A Search Result Specification
查看>>
第一次使用Android Studio时你应该知道的一切配置(一)
查看>>
设计模式之结构型(5)-外观模式(Facade)
查看>>
Python使用requirements.txt安装类库
查看>>
Linux top命令的用法详细详解
查看>>
C# 读取控制台的Console.Write
查看>>
Oracle数据库多行记录转换一行并排序函数
查看>>
MySQL数据库入门笔记
查看>>
大道至简读后感(第六章)
查看>>
[重要更新][Quartus II][14.1正式版]
查看>>
kubeadm安装Kubernetes13.1集群-三
查看>>
整数数组中子数组的最大值
查看>>
通过其轴标签沿 X 轴对齐不同系列中的数据点
查看>>
2019/1/9 6系列所有装置编号与SIM卡信息抓取
查看>>
Git的远程仓库
查看>>
621. Task Scheduler && 358. Rearrange String k Distance Apart
查看>>