题解-Infinite Path

\(\color{#9933cc}{\texttt{Infinite Path}}\)

\(T\) 组测试数据。每次给你一个 \(n\) 的排列 \(\{p_n\}\),以及排列中第 \(i\) 个数的颜色 \(c_i\)。

令两个排列 \(A\) 和 \(B\) 的乘积 \(C=A\times B\) 满足 \(C_i=A_{B_i}\)。

对于排列 \(p\), \(p^k=\underbrace{p \times p \times \cdots \times p}_{k\ p}\)。

求最小的 \(k\),使 \(P=p^k\) 中存在 \(i\) 满足 \(c_i=c_{P_i}=c_{P_{P_i}}=\cdots\)。

数据范围:\(1\le T\le 10^4\),\(1\le n,\sum n\le 2\times 10^5\)。


可以把每个 \(p_i\) 看做一条 \(i\to p_i\) 的边。

因为 \(p\) 是个排列,所以会形成多个环,每个点每条边都在一个环上

所以可以单独考虑每个环的最小 \(k\),然后答案取其最小值。

设当前环大小为 \(sz\):

\(k\) 每 \(+1\) 就使原来的边 \(i\to p^k_{i}\) 变成了 \(i\to p^{k+1}_{i}\)。

设 \(g=\gcd(k,sz)\),很明显 \(p^k\) 的图中每个环元素和 \(p^g\) 中的一样。

所以只需考虑 \(k\) 是 \(sz\) 的因数的情况

每一整个大环会被分成 \(\frac{sz}{k}\) 个环,环上相邻元素在原环上距离为 \(k\)。

然后对 \(\frac{sz}{k}\) 个环判断是否颜色相等,如果有颜色相等的环,就说明对于该环该 \(k\) 是合法的。

然后枚举 \(k\),找到最小合法 \(k\) 即可。

时间复杂度 \(\Theta(n\sigma(n))\)(\(\sigma(n)\) 表示 \(n\) 的约数个数)。


蒟蒻讲不清楚,放个只有一个环情况的例图:


\(\texttt{vector}\) 代码实现

#include <bits/stdc++.h>
using namespace std; //&Start
#define re register
#define il inline
#define inf 0x3f3f3f3f
typedef long long lng; //&Data
#define N 200000
bitset<N+5> vis; //&Main
int main(){
re int t,n,ans;
scanf("%d",&t); //多组测试数据!
for(re int ti=1;ti<=t;ti++){
scanf("%d",&n);
vector<int> p(n+1),c(n+1);
for(re int i=1;i<=n;i++) scanf("%d",&p[i]);
for(re int i=1;i<=n;i++) scanf("%d",&c[i]);
vis.reset(),ans=inf;
for(re int i=1;i<=n;i++)if(!vis[i]){ //如果该点未出现于之前的环
vector<int> C,d; //C:该环上的点的颜色,d:sz的因素
for(re int j=i,f=1;f||j!=i;f=0,j=p[j]) C.push_back(c[j]),vis[j]=1;
re int sz=C.size(),K;
for(re int j=1;j<=sz;j++)if(sz%j==0) d.push_back(j);
for(re int k:d){
re int ok=0;
for(re int s=0;s<k;s++){
re int samc=1;
for(re int j=s;j<sz;j+=k)if(C[j]!=C[s]){samc=0;break;} //判断环上点颜色相等
if(samc){ok=1;break;}
}
if(ok){K=k;break;}
}
ans=min(ans,K); //取k最小值
}
printf("%d\n",ans);
}
return 0;
}

祝大家学习愉快!

题解-Infinite Path的更多相关文章

  1. CF1327D Infinite Path 题解

    原题链接 太坑了我谔谔 简要题意: 求一个排列的多少次幂能达到另一个排列.排列的幂定义见题.(其实不是新定义的,本来就是这么乘的) 很显然,这不像快速幂那样可以结合律. 既然这样,就从图入手. 将 \ ...

  2. [LeetCode 题解]:Path Sum

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a bi ...

  3. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

  4. LeetCode题解——Unique Path(DP与优化)

    题目:A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  5. [译]学习IPython进行交互式计算和数据可视化(三)

    第二章 在本章中,我们将详细学习IPython相对以Python控制台带来的多种改进.特别的,我们将会进行下面的几个任务: 从IPython中使用系统shell以在shell和Python之间进行强大 ...

  6. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  7. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  8. 巧用 CSS 实现动态线条 Loading 动画

    有群友问我,使用 CSS 如何实现如下 Loading 效果: 这是一个非常有意思的问题. 我们知道,使用 CSS,我们可以非常轻松的实现这样一个动画效果: <div></div&g ...

  9. Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解

    题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串. 思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn).代码很 ...

随机推荐

  1. UNP——原始套接字

    1.原始套接字的用处 使用原始套接字可以构造或读取网际层及其以上报文. 具体来说,可以构造 ICMP, IGMP 协议报文,通过开启 IP_HDRINCL 套接字选项,进而自定义 IPv4首部. 2. ...

  2. Python_图解教程

    说明:本教程用图片+源码讲解Python常见的问题,共勉! 1.Python包的调用   # coding:utf8 # from pakge.mymodel import test from bao ...

  3. rootfs如何取消登录超时

    一种简便的办法,在etc/inittab文件中,增加一行::respawn:-/bin/login.之后当登录超时后,还会在进入到登录界面,就不会出现登录超时后无法在登录的问题了. #first:ru ...

  4. 汇编语言CPU状态控制指令

    CPU状态控制指令 1.空操作指令NOP /该指令不执行任何操作,只是使IP加1,其机器码占有一个字节的存储单元,常用于程序调试./ 2.总线封锁前缀指令LOCK /该指令与其他指令联合使用,作为指令 ...

  5. .Net 开源项目 FreeRedis 实现思路之 - Redis 6.0 客户端缓存技术

    写在开头 FreeRedis 是一款继 CSRedisCore 之后重写的 .NET redis 客户端开源组件,以 MIT 协议开源托管于 github,目前支持 .NET 5..NETCore 2 ...

  6. 如何使用MathType输入贝塔符号?

    在文档中使用公式,常常需要输入各种符号.比如要输入三角函数公式,那么就要输入三角函数中的阿尔法α.贝塔β等符号,那么要怎么打出这类符号呢? MathType作为强大的数学公式编辑器,可以用来编辑各种数 ...

  7. Java数据结构(七)—— 排序算法

    排序算法(Sort Algorithm) 排序算法介绍和分类 将一组数据,依指定顺序进行排列 排序的分类 内部排序 指将需要处理的所有数据都加载到内部存储器中进行排序 外部排序 数据量过大,无法全部加 ...

  8. Windows启用SSH命令

    前言 直接通过windows自带的CMD终端远程连接服务器,需要先安装好OpenSSH客户端. 安装 使用浏览器打开官网: https://www.mls-software.com/opensshd. ...

  9. Clickhouse 入门

    clickhouse 简介 ck是一个列式存储的数据库,其针对的场景是OLAP.OLAP的特点是: 数据不经常写,即便写也是批量写.不像OLTP是一条一条写 大多数是读请求 查询并发较少,不适合放置先 ...

  10. 【服务总线 Azure Service Bus】Service Bus在使用预提取(prefetching)后出现Microsoft.Azure.ServiceBus.MessageLockLostException异常问题

    问题描述 Service Bus接收端的日志中出现大量的MessageLockLostException异常.完整的错误消息为: Microsoft.Azure.ServiceBus.MessageL ...