挺神仙的置换题

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. 20155306 白皎 《网络攻防》 EXP7 网络欺诈技术防范

    20155306 白皎 <网络攻防> EXP7 网络欺诈技术防范 问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 局域网内的攻击以及连接公众场所的共享wifi (2)在日常 ...

  2. 20155328 网络攻防 实验五:MSF基础应用

    20155328 网络攻防 实验五:MSF基础应用 实践内容及过程记录 一.Windows服务渗透攻击----ms08_067 攻击机:kali 靶机:WindowsXP(英文版) 第一步,分别查看攻 ...

  3. [C/C++标准库]_[初级]_[转换UTC时间到local本地时间]

    场景 1.如果有面向全球用户的网站, 一般在存储时间数据时存储的是UTC格式的时间, 这样时间是统一的, 并可以根据当地时区来进行准确的转换. 2.存储本地时间的问题就在于如果换了时区, 那么显示的时 ...

  4. SQL Server 全文搜索

    SQL Server 的全文搜索(Full-Text Search)是基于分词的文本检索功能,依赖于全文索引.全文索引不同于传统的平衡树(B-Tree)索引和列存储索引,它是由数据表构成的,称作倒转索 ...

  5. if 判断文件

    #!/bin/sh#判断文件存在,判断是否为文件夹等testPath="/Volumes/MacBookProHD/Mr.Wen/08 shell命令"testFile=" ...

  6. Scrapy框架中的CrawlSpider

    小思考:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二: ...

  7. 3.3V电源LDO

    1:今天用到1颗3.3v的LDO,如图 输入输出都是3.3V,但是一个是做模拟电压,以后遇到这种情况可以这样使用. 2:二极管降压电路,1.8V转1.5V

  8. C++学习 内存模型和名称空间

    1.单独编译 C++鼓励程序员将组件函数放在独立的文件中,如果只修改了一个文件,则可以只重新编译该文件,然后将它与其他文件的编译版本链接. 一般非常有用的组织程序的策略是把程序分成三部分: 头文件:包 ...

  9. MIT-6.824 MapReduce

    概述 MapReduce是由JeffreyDean提出的一种处理大数据的编程模型,用户定义map和reduce函数,map函数处理原始数据生成一系列键值对中间数据,reduce函数并合相同key的键值 ...

  10. 日本厚劳省对IT技术人员展开确保海外人才调查

    新浪美股讯 5月13日消息,共同社报道,日本厚生劳动省将开始对在国内工作的外国籍系统工程师(SE)及程序员的劳动条件进行实际状况调查.为避免在与海外的人才获取竞争中败北,希望掌握接纳企业的需求等推动企 ...