SP422 TRANSP2 - Transposing is Even More Fun——置换群+反演
挺神仙的置换题
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——置换群+反演的更多相关文章
- SPOJ 422 Transposing is Even More Fun(polay计数)
题目链接:http://www.spoj.com/problems/TRANSP2/ 题意: 思路:不妨设a=1,b=2, 我们发现(001,010,100)组成一个置换,(011,110,101)组 ...
- poj1026 Cipher ——置换群
link:http://poj.org/problem?id=1026 其实这道题目和poj2369这道题目一样. 都是基础的置换群题目.把那道题目理解了,这道题就没问题了. 不过我的方法貌似比较挫, ...
- poj2369 Permutations ——置换群
link:http://poj.org/problem?id=2369 置换群,最简单的那种. 找所有数字循环节的最小公倍数. /* ID: zypz4571 LANG: C++ TASK: perm ...
- 组合数学 - 置换群的幂运算 --- poj CARDS (洗牌机)
CARDS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1448 Accepted: 773 Description ...
- [wikioi 2845]排序的代价(置换群)
有一列数,要对其进行排序(升序).排序只能通过交换来实现.每次交换,可以选择这列数中的任意二个,交换他们的位置,并且交换的代价为二个数的和.排序的总代价是排序过程中所有交换代价之和.先要求计算,对于任 ...
- POJ 3270 Cow Sorting(置换群)
题目链接 题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间. ...
- POJ 1026 Cipher(置换群)
题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...
- poj 1026(置换群)
题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...
- 【SPOJ】Transposing is even more fun!
题意: 给出a.b 表示按先行后列的方式储存矩阵 现在要将其转置 可以交换两个点的位置 求最小操作次数 题解: 储存可以将其视为拉成一条链 设a=5.b=2 则在链上坐标用2^***(a,b)表示为( ...
随机推荐
- go语言之行--golang核武器goroutine调度原理、channel详解
一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...
- 20155321 《网络对抗》 Exp6 信息搜集与漏洞扫描
20155321 <网络对抗> Exp6 信息搜集与漏洞扫描 实验内容 信息搜集 whois 在kali终端输入whois 网址,查看注册的公司.服务.注册省份.传真.电话等信息 dig或 ...
- 【第三方插件】使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- Kubernetes学习之路(十九)之Kubernetes dashboard认证访问
Dashboard:https://github.com/kubernetes/dashboard 一.Dashboard部署 由于需要用到k8s.gcr.io/kubernetes-dashboar ...
- NodeJS旅程 : Less
我一直强调我是个很懒的人,虽然我认为自己是个代码控但不代表我喜欢写大量代码.有做Web前端开发的人一定都接触CSS,由其在当下CSS3更是做出Cool站的必修课.我曾和不少的前端开发讨论过CSS3,我 ...
- 【Direct2D1.1初探】Direct2D特效概览
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...
- Asp.Net_Form验证跟授权
配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验证方式--> <authentication mode=&qu ...
- Dive查看docker镜像层信息
1.主要采用docker运行dive的方式,不然宿主机还要安装go那些挺麻烦的.具体用法可查看官方: https://github.com/wagoodman/dive 2.拉取dive镜像 dock ...
- idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输
众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...
- Keras学习笔记。
1. keras.layers.Dense (Fully Connected Neural NetWork),所实现的运算是output = activation(dot(input, kernel) ...