CF741A 题解
zhang_kevin · · 题解
洛谷题目传送门
CF题目传送门
更好的阅读体验?
题目翻译
在小A的地盘上有许多可爱的妹子。小A的地盘上的所有人被从 Owf ,于是一个有趣的游戏在小A的地盘上开始了。
游戏规则如下:
该游戏有许多轮。如果编号为 Oww...wwf(有 w )。如果 Oww...wwf(有 w)。直到有人听到 Owf(Joon-Joon。不存在同时进行两轮游戏的情况。
为了使游戏更有意思,小M有一个邪恶的计划。他想找到最小的 Joon-Joon,也使得由 Joon-Joon。请为小M找这个最小的
这道题就是输入一个链表,先让你判断链表中的点是否都在某一个环中,让后让你求出所有环的点数的 lcm,对于偶数环在求 lcm 时将该偶数环的点数减半。
很多个人,一次给对应的人打电话。第 Joon-Joon。问 Joon-Joon。
解题思路
题目翻译太恶心了。这道题就是输入一个链表,先让你判断链表中的点是否都在某一个环中,让后让你求出所有环的点数的 lcm,对于偶数环在求 lcm 时将该偶数环的点数减半。
这样,题目就简单多了。注意开 long long!
AC 代码
#include<cstdio>
typedef long long ll;
ll gcd(ll a, ll b){
if(!a){
return b;
}else if(!b){
return a;
}else{
return gcd(b, a%b);
}
}
ll lcm(ll a, ll b){
return a / gcd(a, b) * b;
}
ll a[101], vis[101];
int main(){
ll n;
scanf("%lld", &n);
for (int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
}
ll ans = 1;
for(int i = 1; i <= n; i++){
if(!vis[i]){
int Author_AK_IOI = i, Readers_AK_IOI = 0;
while(!vis[Author_AK_IOI]){
vis[Author_AK_IOI] = 1;
Readers_AK_IOI++;
Author_AK_IOI = a[Author_AK_IOI];
}
if(Author_AK_IOI != i){
puts("-1");
return 0;
}
if(!(Readers_AK_IOI%2)){
Readers_AK_IOI /= 2;
}
ans = lcm(ans, Readers_AK_IOI);
}
}
printf("%lld", ans);
return 0;
}