解题:SPOJ 422 Transposing is Even More Fun
这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=。=
直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节
在一个循环节里的位置有什么特征?用二进制表示位置,那么他们的位置可以通过循环左移a位/循环右移b位互相表示,然后问题就变成了:在左移a位/右移b位的置换群作用下,在a+b个01构成的环里找等价类。仍然不好做,因为现在直接Burnside做不出来,Polya又还没法做,继续转换
我们把每$gcd(a,b)$个数缩成一个,也就是转成$\frac{(a+b)}{gcd(a,b)}$个环数等价类。这样的好处是旋转都变成了1位,然后套上Polya就可以了,大概需要卡一卡常?
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+,mod=1e6+;
int T,a,b,cnt,c1,c2,pwe[],prf[];
int pw[N],npr[N],pri[N],mind[N],fac[N],fai[N];
int GCD(int a,int b)
{
return b?GCD(b,a%b):a;
}
void Add(int &x,int y)
{
x+=y;
if(x>=mod) x-=mod;
}
int Qpow(int x,int k)
{
if(k==) return x;
int tmp=Qpow(x,k/);
return k%?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
}
void Pre()
{
npr[]=true,mind[]=;
for(int i=;i<=;i++)
{
if(!npr[i]) pri[++cnt]=i,mind[i]=i;
for(int j=,k;j<=cnt&&(k=i*pri[j])<=;j++)
{
npr[k]=true,mind[k]=pri[j];
if(i%pri[j]==) break;
}
}
pw[]=;
for(int i=;i<=;i++)
pw[i]=pw[i-]*%mod;
}
void DFS(int idx,int num,int phi)
{
if(idx>c2)
fac[++c1]=num,fai[num]=phi;
else
{
int pr=prf[idx];
DFS(idx+,num,phi);
DFS(idx+,num*=pr,phi*=pr-);
for(int i=;i<=pwe[idx];i++)
DFS(idx+,num*=pr,phi*=pr);
}
}
void Decompose(int x)
{
if(x==)
fac[c1=]=;
else
{
c2=;
while(x!=)
{
prf[++c2]=mind[x],pwe[c2]=;
while(x%prf[c2]==) x/=prf[c2],pwe[c2]++;
}
c1=,DFS(,,);
}
}
int Query(int len,int col)
{
int ret=;
Decompose(len);
for(int i=;i<=c1;i++)
Add(ret,1ll*fai[len/fac[i]]*Qpow(col,fac[i])%mod);
return 1ll*ret*Qpow(len,mod-)%mod;
}
int main()
{
Pre();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
if(!a||!b) puts("");
else
{
int g=GCD(a,b);
printf("%d\n",(pw[a+b]-Query((a+b)/g,pw[g])+mod)%mod);
}
}
return ;
}
解题:SPOJ 422 Transposing is Even More Fun的更多相关文章
- SPOJ 422 Transposing is Even More Fun(polay计数)
题目链接:http://www.spoj.com/problems/TRANSP2/ 题意: 思路:不妨设a=1,b=2, 我们发现(001,010,100)组成一个置换,(011,110,101)组 ...
- SPOJ 422 Transposing is Even More Fun ——Burnside引理
这题目就比较有趣了. 大概题目中介绍了一下计算机的储存方法,给一个$2^a*2^b$的矩阵. 求转置.但是只能交换两个数,求所需要的步数. 首先可以把变化前后的位置写出来,构成了许多的循环.左转将狼踩 ...
- 【SPOJ】Transposing is even more fun!
题意: 给出a.b 表示按先行后列的方式储存矩阵 现在要将其转置 可以交换两个点的位置 求最小操作次数 题解: 储存可以将其视为拉成一条链 设a=5.b=2 则在链上坐标用2^***(a,b)表示为( ...
- SPOJ QTREE 系列解题报告
题目一 : SPOJ 375 Query On a Tree http://www.spoj.com/problems/QTREE/ 给一个树,求a,b路径上最大边权,或者修改a,b边权为t. #in ...
- 【LeetCode】422. Valid Word Square 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 拼接出每一列的字符串 日期 题目地址:https:// ...
- Spring-2-H Array Diversity(SPOJ AMR11H)解题报告及测试数据
Array Diversity Time Limit:404MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
- Spring-2-J Goblin Wars(SPOJ AMR11J)解题报告及测试数据
Goblin Wars Time Limit:432MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Th ...
- Spring-2-B Save the Students(SPOJ AMR11B)解题报告及测试数据
Save the Students Time Limit:134MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- 解题:SPOJ 3734 Periodni
题面 按列高建立笛卡尔树,转成树上问题...... 笛卡尔树是什么? 它一般是针对序列建立的,是下标的BST和权值的堆(即中序遍历是原序列连续区间,节点权值满足堆性质),这里不讲具体怎么建树(放在知识 ...
随机推荐
- BZOJ1000-1099板刷计划(附题解链接)
BZOJ1000-1099板刷计划 感觉完全做不动啊... \(Orz\) \(M\_sea\)板刷bzoj狂魔 1000 - 1009 1000 ...懒得说了 1001 懒得平面图转对偶图,最小割 ...
- Canvas事件绑定
canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等.那我们想给canvas里的某一张图片添加一个点击事件该怎么做到.而js只能监听到canv ...
- libgdx学习记录11——平铺地图TiledMap
地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机Otho ...
- python 生成器按指定大小读取文件
#!/usr/bin/env python import osimport sys def read_file(fpath): Block_Size = 1024 with open(fpath,&q ...
- CSS快速入门-组合选择器
<div class="gradefather"> hello1 <div class="father">hello2 <p cl ...
- install opencv 2.4.10 with issue :"nvcc fatal : Unsupported gpu architecture 'compute_11'"
issue: nvcc fatal : Unsupported gpu architecture 'compute_11'CMake Error at cuda_compile_generated ...
- Unity特殊路径
Resources: Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好.Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources ...
- Hyperledger Fabric网络节点架构
Fabric区块链网络的组成  区块链网络结构图 区块链网络组成 组成区块链网络相关的节点 节点是区块链的通信主体,和区块链网络相关的节点有多种类型:客户端(应用).Peer节点.排序服务(Orde ...
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...
- 1093. Count PAT’s (25)-统计字符串中PAT出现的个数
如题,统计PAT出现的个数,注意PAT不一定要相邻,看题目给的例子就知道了. num1代表目前为止P出现的个数,num12代表目前为止PA出现的个数,num123代表目前为止PAT出现的个数. 遇到P ...