CSDN同步

原题链接

太坑了我谔谔

简要题意:

求一个排列的多少次幂能达到另一个排列。排列的幂定义见题。(其实不是新定义的,本来就是这么乘的)

很显然,这不像快速幂那样可以结合律。

既然这样,就从图入手。

将 \(i\) 和 \(a_i\) 连边。

此时图会形成若干个环,对每个环分别操作。下面讲一个环的操作。

显然,对于一个环:

对于 \(1\) 这个点,\(k\) 次幂就是在环上走 \(k\) 步。

由于一个点的入度和出度都是 \(1\),所以不会有重叠的环,因此是单向的。

所以,这题成了:在环上走很多步?

显然取 \(\gcd\) 即可。

但我们不知道步数,所以要枚举因数。

时间复杂度:\(O(T \times n)\).

实际得分:\(100pts\).

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; const int N=2e5+1; inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int T,n,m,a[N],b[N];
int ans,tot,v[N];
bool h[N]; inline bool check(int x,int y) {
for(int i=1,t;i<=x;i++) {
t=i; bool f=0;
for(int j=1;j<=y;j++) {
if(b[v[t]]!=b[v[i]]) {
f=1; break;
} t=(t+x-1)%tot+1;
} if(!f) return 1;
} return 0;
} //对环检验 inline void dfs(int x) {
tot=0; v[++tot]=x; h[x]=1;
for(int i=a[x];i!=x;i=a[i]) h[i]=1,v[++tot]=i; //构成环
for(int i=1;i<=sqrt(tot);i++)
if(tot%i==0) {
if(check(i,tot/i)) {
ans=min(ans,i); return;
} if(check(tot/i,i)) ans=min(ans,tot/i);
} //枚举因数
} int main(){
T=read(); while(T--) {
n=read(); memset(v,0,sizeof(v));
memset(h,0,sizeof(h)); tot=0;
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read();
ans=INT_MAX;
for(int i=1;i<=n;i++)
if(!h[i]) dfs(i);
printf("%d\n",ans);
}
return 0;
}

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

  1. 题解-Infinite Path

    题解-Infinite Path \(\color{#9933cc}{\texttt{Infinite Path}}\) \(T\) 组测试数据.每次给你一个 \(n\) 的排列 \(\{p_n\}\ ...

  2. 【字典树】【树】【二进制】bzoj1954/POJ3764The xor-longest Path 题解

        建立字典树是异或的一种处理方法. Description In an edge-weighted tree, the xor-length of a path p is defined as ...

  3. 洛谷 UVA12101 Prime Path 题解

    一道经典的BFS 用四个for搜索四位就行了,只要能推出怎么只变4位中的一位就很水了 #include<iostream> #include<cstring> #include ...

  4. CF1260C Infinite Fence 题解(扩欧)

    题目地址 CF1260C 题目大意 现有\(10^{100}\)块木板需要涂漆,第x块如果是x是a的倍数,则涂一种颜色,是b的倍数,则涂另一种颜色.如果既是a又是b的倍数,那么两种颜色都可以涂:如果连 ...

  5. CF675A Infinite Sequence 题解

    Content 给定三个整数 \(a,b,c\),问你 \(b\) 是否在以 \(a\) 为首项,公差为 \(c\) 的等差数列中. 数据范围:\(-10^9\leqslant a,b,c\leqsl ...

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

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

  7. [USACO15JAN]草鉴定Grass Cownoisseur(分层图+tarjan)

    [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows ...

  8. 算法与数据结构基础 - 递归(Recursion)

    递归基础 递归(Recursion)是常见常用的算法,是DFS.分治法.回溯.二叉树遍历等方法的基础,典型的应用递归的问题有求阶乘.汉诺塔.斐波那契数列等,可视化过程. 应用递归算法一般分三步,一是定 ...

  9. NOIp2018集训test-9-4

    老张让我们2.5h考NOI%你题,喵喵喵? 因为今(我)天(实)的(在)题(太)鬼(弱)畜(了)了,我还只改了t1. Problem A. reorder 考试的时候大家都写了最长不降子序列,然后全员 ...

随机推荐

  1. 机器学习迁移模型到IOS

    https://paulswith.github.io/2018/02/24/%E8%BF%81%E7%A7%BB%E5%AD%A6%E4%B9%A0InceptionV3/ 上文记录了如何从一个别人 ...

  2. (转)linux如何获取鼠标相对位置信息

    #include <stdio.h> #include <stdlib.h> #include <linux/input.h> #include <fcntl ...

  3. Event Loop事件循环,GET!

    JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...

  4. string类中getline函数的应用

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. webpack中打包拷贝静态文件CopyWebpackPlugin插件

    copyWebpackPlugin: 作用:用于webpack打包时拷贝文件的插件包 安装:npm install copyWebpackPlugin@版本号 使用:// copy custom st ...

  6. web前端性能优化一

    作为一个前端会允许自己的作品,在非硬性条件下出现卡顿? 肯定是不会,所以给大家梳理一下前端性能的优化. 一:文件操作 html文件压缩: 删除无用的空格和换行符等其他无意义字符 css文件压缩: 删除 ...

  7. Windows GDI 窗口与 Direct3D 屏幕截图

    前言 Windows 上,屏幕截图一般是调用 win32 api 完成的,如果 C# 想实现截图功能,就需要封装相关 api.在 Windows 上,主要图形接口有 GDI 和 DirectX.GDI ...

  8. py基础之无序列表

    '''dic是一个可以将两个相关变量关联起来的集合,格式是dd={key1:value1,key2:value2,key3:value3}'''d = { 'adam':95, 'lisa':85, ...

  9. Codeforces Round #295 (Div. 2) B. Two Buttons 520B

    B. Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  10. 使用PHP语言制作具有加减乘除取余功能的简单计算器

    准备工作: 使用环境 :PHPStudy 开启Apache和Mysql 打开代码编辑器 <!DOCTYPE html> <html lang="en"> & ...