Atcoder Grand Contest 031 D - A Sequence of Permutations(置换+猜结论)
猜结论神题。
首先考虑探究题目中 \(f\) 函数的性质,\(f(p,q)_{p_i}=q_i\leftarrow f(p,q)\circ p=q\),其中 \(\circ\) 为两个置换的复合,\(a\circ b\) 为满足 \(p_{i}=a_{b_i}\) 的置换 \(p\),有点类似于函数的复合,u1s1 我一直把它当作乘法运算,因此总没搞清楚,心态爆炸……等式两边同乘 \(p\) 的复合逆 \(p^{-1}\) 可得 \(f(p,q)=q\circ p^{-1}\)。顺带一提复合满足性质 \((p\circ q)^{-1}=q^{-1}\circ p^{-1}\),这个对后面打表找规律有很大作用。
接下来考虑探究置换序列 \(a\) 的性质,我们不妨根据刚刚的性质先写出 \(a\) 的前几项看看瞧:
\]
\]
\]
\]
\]
\]
\]
注意到这东西是一个类似于线性递推的东西,并且此题 \(k\) 高达 \(10^9\),因此暴力推下去肯定是不行的,不过注意到相邻两项的 \(p,q\) 之间存在一些联系,具体来说,下一项实际上是对上一项进行如下变换:
- 将所有 \(p\) 用 \(q\) 代替,\(p^{-1}\) 用 \(q^{-1}\) 代替
- 将所有 \(q\) 用 \(q\circ p^{-1}\) 代替,\(q^{-1}\) 用 \(p\circ q^{-1}\) 代替
那有人就问了,知道这个性质有什么用呢?你就算做了这样一个转化,还不照样还是要递推吗?
这里又有一个考验眼力的地方,注意到 \(a_5\) 中出现了一个式子叫做 \(q\circ p^{-1}\circ q^{-1}\circ p\),我们不妨对其做一遍上面的变换,可得 \((q\circ p^{-1})\circ q^{-1}\circ (p\circ q^{-1})\circ q\),削消一下发现它就是 \(q\circ p^{-1}\circ q^{-1}\circ p\),也就是说从 \(a_5\) 开始出现的 \(q\circ p^{-1}\circ q^{-1}\circ p\) 在变换前后不会发生变化,记 \(A=q\circ p^{-1}\circ q^{-1}\circ p\),继续往下写几项可得:
\]
\]
\]
\]
发现了什么?\(p^{-1}\circ q\circ p\circ q^{-1}\) 就是 \(A^{-1}\),因此 \(a_8\) 就等于 \(A\circ q\circ A^{-1}\),按照上面的方式 \(a_7\) 也可变形为 \(A\circ p\circ A^{-1}\)。
\(A,A^{-1}\) 在变换前后都可看作不动点,因此 \(a\) 序列可以看作类周期性变化的,即 \(a_n=A\circ a_{n-6}\circ A^{-1}\)
矩阵快速幂即可。
总之是一道考验眼力的猜结论神题。
const int MAXN=1e5;
int n,k;
struct perm{
int a[MAXN+5];
perm(){for(int i=1;i<=n;i++) a[i]=i;}
perm operator *(const perm &rhs) const{
perm ret;
for(int i=1;i<=n;i++) ret.a[i]=a[rhs.a[i]];
return ret;
}
} p,q;
perm inv(perm x){
perm ret;
for(int i=1;i<=n;i++) ret.a[x.a[i]]=i;
return ret;
}
perm qpow(perm x,int e){
perm ret;
for(;e;e>>=1,x=x*x) if(e&1) ret=ret*x;
return ret;
}
int main(){
scanf("%d%d",&n,&k);k--;perm ans;
for(int i=1;i<=n;i++) scanf("%d",&p.a[i]);
for(int i=1;i<=n;i++) scanf("%d",&q.a[i]);
perm A=q*inv(p)*inv(q)*p;
if(k%6==0) ans=p;
if(k%6==1) ans=q;
if(k%6==2) ans=q*inv(p);
if(k%6==3) ans=A*inv(p);
if(k%6==4) ans=A*inv(q);
if(k%6==5) ans=A*p*inv(q);
ans=qpow(A,k/6)*ans*qpow(inv(A),k/6);
for(int i=1;i<=n;i++) printf("%d ",ans.a[i]);
return 0;
}
Atcoder Grand Contest 031 D - A Sequence of Permutations(置换+猜结论)的更多相关文章
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 031题解
题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...
- AtCoder Grand Contest 031 (AGC031) D - A Sequence of Permutations 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC031D.html 前言 比赛的时候看到这题之后在草稿纸上写下的第一个式子就是 $$f(p,q) = pq^ ...
- AtCoder Grand Contest 031 B - Reversi
https://atcoder.jp/contests/agc031/tasks/agc031_b B - Reversi Time Limit: 2 sec / Memory Limit: 1024 ...
- AtCoder Grand Contest 031 B - Reversi(DP)
B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...
- UPC个人训练赛第十五场(AtCoder Grand Contest 031)
传送门: [1]:AtCoder [2]:UPC比赛场 [3]:UPC补题场 参考资料 [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html B.Re ...
- [AtCoder Grand Contest 024 Problem E]Sequence Growing Hard
题目大意:考虑 N +1 个数组 {A0,A1,…,AN}.其中 Ai 的长度是 i,Ai 内的所有数字都在 1 到 K 之间. Ai−1 是 Ai 的子序列,即 Ai 删一个数字可以得到 Ai−1. ...
- Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)
题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...
- AtCoder Grand Contest 003
AtCoder Grand Contest 003 A - Wanna go back home 翻译 告诉你一个人每天向哪个方向走,你可以自定义他每天走的距离,问它能否在最后一天结束之后回到起点. ...
随机推荐
- UML快速概述 - All you need to know about UML
UML 是统一建模语言的缩写,就像使用一组图表来可视化软件建模的蓝图(或设计计划).它不仅可以让您彻底评估整个概念,还可以确保团队中的每个人都在同一页面上. UML 图可以组织成两个不同的组. 结 ...
- 软件案例分析——VS和VS Code
软件案例分析--VS和VS Code 项目 内容 这个作业属于哪个课程/ 2020年春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里? 软件案例分析 我在这个课程的目标是? 提高代码水平,熟 ...
- RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息
概述 DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); ...
- Photoshop教程,视频MP4格式转换为GIF格式
转自百度问题 https://zhidao.baidu.com/question/1497485136643778259.html Adobe PhotoShop软件的最bai新du本是可以编辑视zh ...
- python3中的bytes和string
原文链接:https://www.cnblogs.com/abclife/p/7445222.html python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分.文本总是 ...
- NOIP 模拟 八十五
T1 冲刺NOIP2021模拟18 莓良心 容易发现答案和每一个 \(w_i\) 无关,我们只需要求出总和然后计算方案数. 对于每一个数贡献的方案数是相同的,首先是自己的部分就是\(\begin{Bm ...
- 从零开始 DIY 智能家居 - 智能开窗器
前言 做完智慧浇水器之后对这种可以节省时间和精力的场景总有一种谜之向往(懒鬼是这样的),这次我准备做一个可以自动开窗的装置,结合之前的甲醛检测传感器就可以实现甲醛含量过高自动开窗通风,之后还可以把燃气 ...
- JAVA笔记 **__Netbeans常用快捷键
sout + Tab 生成输出语句 alt+shift+F 格式化代码 Alt+insert 插入代码(包括构造函数,setter和getter方法等) Ctrl+O或Ctrlt+单击 转 ...
- 基于 OSPF 路由的邻居邻接关系发现实践
1.实验目的 理解 OSPF 邻居关系和 OSPF 邻接关系的含义及差别 观察 OSPF 邻居邻接关系的建立过程 观察 OSPF 链路状态数据库的同步过程 2.实验原理 OSPF 网络中,路由器在发送 ...
- robot_framewok自动化测试--(6)Collections 库
Collections 库 Collections 库同样为 Robot Framework 标准类库,它所提供的关键字主要用于列表.索引.字典的处理. 在使用之前需要在测试套件(项目)中添加: 1. ...