题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3430

题意:给我们一个置换,问我们经过几次置换能把一个1~n的初始序列转换成另一个序列,如果不能就输出-1.

第一步,肯定还是暴力找到每一位的循环节以及要达到这个目标状态的偏移量,事实上,我们得到了k个类似于a==b(mod c)这样的方程,k为循环节的个数,那么这就又变成了一个中国剩余定理的问题,这里我们可以直接套用不互质的中国剩余定理模板就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 522;
int a[maxn], b[maxn], ta[maxn], tb[maxn];
bool vis[maxn];
LL m[maxn], c[maxn];
void exGcd(LL a,LL b,LL &d,LL &x,LL &y)
{  if(!b){d=a;x=1;y=0;}  else{exGcd(b,a%b,d,y,x);y-=x*(a/b);}
}
LL Chinese_Remainder(LL n,LL a[],LL b[])
{  LL m1,r1,m2,r2,flag=0,i,d,x,y,c,t;  m1=a[0],r1=b[0];  flag=0;  for(i=1;i<n;i++)  {  m2=a[i],r2=b[i];  if(flag)continue;  exGcd(m1,m2,d,x,y);c=r2-r1;  if(c%d){  flag=1;  continue;  }  t=m2/d; x=(c/d*x%t+t)%t;r1=m1*x+r1;m1=m1*m2/d;  }  if(flag)return -1;  return r1;
}
int solve(int n)
{memset(vis, false, sizeof(vis));int cnt = 0;for(int i = 1; i <= n; ++i)if(!vis[i]){int num = 0, t = i;while(!vis[t]){vis[t] = true;ta[++num] = t;tb[num] = b[t];t = a[t];}bool same = false;for(int i = 1; i <= num; ++i)if(tb[i] == ta[1]){same = true;int j = i, k = 1;do{if (tb[j] != ta[k]) same = false;j = j % num + 1;k = k % num + 1;}while(i != j);t = i;break;}if(!same){printf("-1\n");return -1;}m[cnt] = num;c[cnt++] = (num - t + 1) % num;}return cnt;
}
int main()
{int n;while(scanf("%d",&n) && n){for(int i=1; i<=n; i++) scanf("%d",&a[i]);for(int i=1; i<=n; i++) scanf("%d",&b[i]);int cnt;if((cnt = solve(n)) != -1)cout << Chinese_Remainder(cnt,m,c)<<endl;}
}

HDOJ 3430 Shuffling相关推荐

  1. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  2. 【HDOJ 3652】B-number

    [HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...

  3. 【HDOJ】4343 Interval query

    最大不相交集合的数量. 思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界. 离散化后,通过贪心解. 1 /* 4343 */ 2 #include <iostream&g ...

  4. 【HDOJ】4579 Random Walk

    1. 题目描述 一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路 显然是个DP.公式推导也相当容易.不妨设$ ...

  5. AC自动机 HDOJ 5384 Danganronpa

    题目传送门 1 /* 2 题意:多个文本串,多个模式串在每个文本串出现的次数 3 AC自动机:这就是一道模板题,杭电有道类似的题目 4 */ 5 /************************** ...

  6. 构造 HDOJ 5400 Arithmetic Sequence

    题目传送门 题意:问有多少个区间,其中存在j使得ai + d1 == ai+1(i<j) && ai + d2 == ai+1 (i>j) 构造:用c1[i], c2[i] ...

  7. Kruskal HDOJ 1233 还是畅通工程

    题目传送门 1 /* 2 最小生成树之kruskal算法--并查集(数据结构)实现 3 建立一个结构体,记录两点和它们的距离,依照距离升序排序 4 不连通就累加距离,即为最小生成树的长度 5 */ 6 ...

  8. HDOJ 5373 The shortest problem 【数论】

    HDOJ 5373 The shortest problem [数论] 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5373 题目给一个初始数据和重复 ...

  9. PAT甲级1042 Shuffling Machine:[C++题解]模拟、哈希表、洗牌机

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:序列置换. 这里用到函数memcpy()用于数组复制,用法memcpy(dest, src, sizeof dest); 把src数组 ...

最新文章

  1. oracle数据库逐步学习总结【基础一】
  2. python os模块详细用法
  3. 操作系统中的内存分配
  4. Spring Cloud Gateway 源码解析(2) —— 路由
  5. Armijo-Goldstein和wolfe-power的matlab代码实现(转)
  6. Python与MySQL连接
  7. 23.多线程 实现的两种方式
  8. 给一线讲产品·8期|VPC、子网、安全组,是什么关系?
  9. 【codevs2370】小机房的树,RMQ求LCA
  10. mysql内连接和外连接的区别_数据库左连接、右连接、内连接、全连接区别
  11. 张量(tensor)
  12. 写给测试小白:怎么快速找到bug?怎么写测试用例?
  13. tomcat启动报错:Address already in use: JVM_Bind
  14. 虚拟机配置centos7.5网卡网络
  15. cad画圆如何确定圆心_CAD如何利用对象捕捉追踪功能来确定小圆圆心以及矩形的角点位置...
  16. 调侃大学生[太有才了]
  17. 局域网传文件_跨平台传输文件方案大汇总(中篇)——可能全网最全的传输方案了...
  18. 电路设计中如何解决电压跌落
  19. css 文本三行显示,超出省略号表示
  20. 飞腾cpu服务器浪潮信息,从“芯”开始飞腾 浪潮发布全国产服务器

热门文章

  1. linux安装ntpd服务端,Linux升级NTPD服务器-编译安装ntp-4.2.8p9与配置NTPD服务器
  2. 计算机网络信息中心韩文静,语音情感识别研究进展综述_韩文静
  3. 2023年户外健身行业现状及前景:户外健身行业迎来发展新机遇
  4. 20.时钟抖动(jitter)和时钟偏移(skew)的概念?
  5. SVN(一)SVN的安装及配置(客户端+服务端)
  6. 程序人生 - 如何判断外卖餐盒是否安全卫生?
  7. 紫星文件通(班委学委收集作业查人神器)
  8. 成都python培训比较好的机构-成都Python全栈培训
  9. Isolated User Mode (IUM) Processes(MSDN翻译)
  10. Uncaught Error: Script error for popper.js, needed by: bootstrap 解决方案