题目大意:
很多个人,一次给对应的人打电话。第t个人就是第一个人的Joon-Joon。问t最小为多少可以让每两个人
互为Joon-Joon。
做法:
对于每一个人我们求一次环的长度,然后如果是偶数除以2,然后把n个环长取一个最小公倍数就好了。其中特判一下不能构成环的情况即可。答案是会爆longlong的,第一遍我又没开,总是挂在这种傻傻的地方。
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int vis[100005];
int a[100005];
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
int find(int x,int goal,int sum)
{
if (x==goal) return sum;
if (vis[x]>2) return 0;
vis[x]++;
find(a[x],goal,sum+1);
}
int main()
{
int n; long long ans;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
int t=find(a[i],i,1);
if (t==0){
printf("%d",-1);
return 0;
}
if (t%2==0) t=t/2;
if (i==1) ans=t;
else ans=ans*t/gcd(ans,t);
}
printf("%lld",ans);
return 0;
}