挺神仙的置换题

SP422 TRANSP2 - Transposing is Even More Fun

这个博客除了开始举例子别的都是对的:

https://blog.csdn.net/BraketBN/article/details/50668414

首先理解题意:

就是单纯的矩阵转置,一行一行存储。

(全部下标从0开始)

一个位置(i,j)在转置后会变成(j,i)

原来存储的位置是(下标从0开始):i*2^b+j

现在是:j*2^a+i

发现其实就是一个二进制数循环右移b位得到的

向要到的位置连边,会形成K个置换环

每个置换环内部换会len-1省一次

总共就是:2^(a+b)-K

关键是求K

问题转化为:

有2^(a+b)个元素

两个元素是等价类当且仅当A循环右移b位和B相等

求等价类的个数

分母枚举所有的置换

分子计算所有不动点的个数

画画图,发现,在(a+b)的环上,一次走b步,最后有gcd(a,b)个置换环,和一次走gcd(a,b)步是一样的

所以,可以这样写,然后反演:

摘自:https://blog.csdn.net/BraketBN/article/details/50668414

然后,2的次幂可以预处理,phi线性筛,d可以快速质因数分解,然后dfs枚举约数

n直接求逆元,复杂度就是O(因子个数*T)

代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int mod=;
const int N=1e6+;
int vis[N],pri[N],phi[N],tot;
int mindiv[N];
int yin[],zhi[],cnt;
void sieve(){
phi[]=;
for(reg i=;i<=1e6;++i){
if(!vis[i]){
vis[i]=;
mindiv[i]=i;
pri[++tot]=i;
phi[i]=i-;
}
for(reg j=;j<=tot;++j){
if(pri[j]*i>1e6) break;
vis[pri[j]*i]=;
mindiv[i*pri[j]]=pri[j];
if(i%pri[j]==){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}else{
phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
}
}
ll ans;
int pw[N];
int g,n;
void dfs(int x,int fac){
if(x==cnt+){
ans=(ans+(ll)pw[fac*g]*phi[n/fac]%mod)%mod;
return;
}
dfs(x+,fac);
int tmp=yin[x];
for(reg i=;i<=zhi[x];++i){
dfs(x+,fac*tmp);
tmp=tmp*yin[x];
}
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int main(){
int t,a,b;
sieve();
pw[]=;
for(reg i=;i<=1e6;++i) pw[i]=(ll)pw[i-]*%mod; rd(t);
while(t--){
rd(a);rd(b);
if(a==||b==){
puts("");continue;
}
g=gcd(a,b);
n=(a+b)/gcd(a,b);
// cout<<" n "<<n<<endl;
cnt=;
ans=; int tmp=n;
while(mindiv[tmp]){
yin[++cnt]=mindiv[tmp];
zhi[cnt]=;
while(mindiv[tmp]==yin[cnt]) tmp/=mindiv[tmp],++zhi[cnt];
}
dfs(,); ans=(ll)ans*qm(n,mod-)%mod;
ans=(qm(,a+b)-ans+mod)%mod;
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/18 11:31:26
*/

总结:
一个置换思想套置换本身的好题

反演还过来凑凑热闹

SP422 TRANSP2 - Transposing is Even More Fun——置换群+反演的更多相关文章

  1. SPOJ 422 Transposing is Even More Fun(polay计数)

    题目链接:http://www.spoj.com/problems/TRANSP2/ 题意: 思路:不妨设a=1,b=2, 我们发现(001,010,100)组成一个置换,(011,110,101)组 ...

  2. poj1026 Cipher ——置换群

    link:http://poj.org/problem?id=1026 其实这道题目和poj2369这道题目一样. 都是基础的置换群题目.把那道题目理解了,这道题就没问题了. 不过我的方法貌似比较挫, ...

  3. poj2369 Permutations ——置换群

    link:http://poj.org/problem?id=2369 置换群,最简单的那种. 找所有数字循环节的最小公倍数. /* ID: zypz4571 LANG: C++ TASK: perm ...

  4. 组合数学 - 置换群的幂运算 --- poj CARDS (洗牌机)

    CARDS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1448   Accepted: 773 Description ...

  5. [wikioi 2845]排序的代价(置换群)

    有一列数,要对其进行排序(升序).排序只能通过交换来实现.每次交换,可以选择这列数中的任意二个,交换他们的位置,并且交换的代价为二个数的和.排序的总代价是排序过程中所有交换代价之和.先要求计算,对于任 ...

  6. POJ 3270 Cow Sorting(置换群)

    题目链接 题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间. ...

  7. POJ 1026 Cipher(置换群)

    题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...

  8. poj 1026(置换群)

    题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...

  9. 【SPOJ】Transposing is even more fun!

    题意: 给出a.b 表示按先行后列的方式储存矩阵 现在要将其转置 可以交换两个点的位置 求最小操作次数 题解: 储存可以将其视为拉成一条链 设a=5.b=2 则在链上坐标用2^***(a,b)表示为( ...

随机推荐

  1. go语言之行--golang核武器goroutine调度原理、channel详解

    一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...

  2. 20155321 《网络对抗》 Exp6 信息搜集与漏洞扫描

    20155321 <网络对抗> Exp6 信息搜集与漏洞扫描 实验内容 信息搜集 whois 在kali终端输入whois 网址,查看注册的公司.服务.注册省份.传真.电话等信息 dig或 ...

  3. 【第三方插件】使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  4. Kubernetes学习之路(十九)之Kubernetes dashboard认证访问

    Dashboard:https://github.com/kubernetes/dashboard 一.Dashboard部署 由于需要用到k8s.gcr.io/kubernetes-dashboar ...

  5. NodeJS旅程 : Less

    我一直强调我是个很懒的人,虽然我认为自己是个代码控但不代表我喜欢写大量代码.有做Web前端开发的人一定都接触CSS,由其在当下CSS3更是做出Cool站的必修课.我曾和不少的前端开发讨论过CSS3,我 ...

  6. 【Direct2D1.1初探】Direct2D特效概览

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...

  7. Asp.Net_Form验证跟授权

    配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验证方式--> <authentication mode=&qu ...

  8. Dive查看docker镜像层信息

    1.主要采用docker运行dive的方式,不然宿主机还要安装go那些挺麻烦的.具体用法可查看官方: https://github.com/wagoodman/dive 2.拉取dive镜像 dock ...

  9. idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

    众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...

  10. Keras学习笔记。

    1. keras.layers.Dense (Fully Connected Neural NetWork),所实现的运算是output = activation(dot(input, kernel) ...