题目链接:http://codeforces.com/contest/742/problem/C

题意:题目比较难理解,起码我是理解了好久,就是给你n个位置每个位置标着一个数表示这个位置下一步能到哪个位置,然后要求

求一个数t,保证经过t步x能到达y,而且y经过t步能到x,而且是所有点都要满足。

这题只有一种情况是无法得到结果的,那就是有两个以上的点通向同一个位置。其实题目中也略微有点提示。

然后剩下的就差不多靠暴力解决,但还是有点技巧的。

注意要满足题目中要求其实就是找单向联通块,如果联通数为偶数那么就可以折半,否则就为循环到自己。

然后求各个联通块的gcd即可。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int M = 110;
int gcd(int a , int b) {
return b ? gcd(b , a % b) : a;
}
int vis[M] , Next[M] , have[M];
int dfs(int pos) {
if(vis[Next[pos]])
return 0;
vis[Next[pos]] = 1;
return 1 + dfs(Next[pos]);
}
int main() {
int n;
scanf("%d" , &n);
int flag = 0;
for(int i = 1 ; i <= n ; i++) {
scanf("%d" , &Next[i]);
have[Next[i]]++;
if(have[Next[i]] > 1)
flag = 1;
}
if(flag == 1) {
printf("-1\n");
}
else {
int ans = 1;
for(int i = 1 ; i <= n ; i++)
vis[i] = 0;
for(int i = 1 ; i <= n ; i++) {
if(vis[i])
continue;
int l = dfs(i);
if(l % 2 == 0)
l /= 2;
ans = (ans * l) / gcd(ans , l);
}
printf("%d\n" , ans);
}
return 0;
}

最新文章

  1. 设置共享,实现Linux和Windows之间的共享
  2. Python全栈开发day8
  3. [转]MySQL去除查询结果重复值
  4. TI CC2541的整体目标
  5. Web前端工作2个月小结
  6. android获取屏幕分辨率
  7. Eclipse 代码提示不显示的问题
  8. leetcode第12题--Integer to Roman
  9. mac解压缩
  10. Wo Wei Shen Me Hui Zai cnblogs Xie Bo Ke
  11. Grafana+Prometheus系统监控之钉钉报警功能
  12. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
  13. NewLife.Net——开始网络编程
  14. UVAlive 6697 Homework Evaluation
  15. HDU5988/nowcoder 207G - Coding Contest - [最小费用最大流]
  16. libvirt工具实现虚拟机管理
  17. bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数
  18. [Python学习]Iterator 和 Generator的学习心得
  19. postgresql数据库常用命令
  20. Flash(as3) 调整显示对象颜色

热门文章

  1. Docker入门学习笔记
  2. zookeeper 集群配置
  3. 牛客多校训练第八场G.Gemstones(栈模拟)
  4. HTML之必备meta标签
  5. 为什么我们不用JIRA
  6. 最新 Flutter 团队工程师中文演讲 | Flutter 的性能测试和理论
  7. (三十一)c#Winform自定义控件-文本框(四)
  8. K8S搭建-1 Master 2 Workers(dashboard+ingress)
  9. SparkSQL Adaptive Execution
  10. Hive 窗口分析函数