思路:在这个集合中找到一共有多少的环,如果环中元素个数为奇数,则不变,为偶数,则除以2,最后求出所有环的最小公倍数。
#include<bits/stdc++.h>
using namespace std;
int pre[105],n,num;
bool visit[105];
void dfs(int x,int now)
{if(visit[now]){num=-1;return;}num++;if(now==x){return;}dfs(x,pre[now]);visit[now]=1;
}
int lcm(int a,int b)
{int aa=a,bb=b;if(aa<bb)swap(aa,bb);int temp=aa%bb;while(temp){aa=bb;bb=temp;temp=aa%bb;}return a*b/bb;
}
int main()
{int now=-1,flag=0,flag1=0;cin>>n;for(int i=1;i<=n;i++)pre[i]=i;for(int i=1;i<=n;i++){cin>>pre[i];if(!visit[pre[i]])visit[pre[i]]=1;elseflag1=1;}if(flag1)cout<<-1<<endl;else{memset(visit,0,sizeof(visit));for(int i=1;i<=n;i++){if(!visit[i]){num=0;dfs(i,pre[i]);if(num==-1){flag=1;break;}else if(now==-1){if(num%2==0)num/=2;now=num;}else if(now!=num){if(num%2==0)num/=2;now=lcm(now,num);}visit[i]=1;}}if(flag)cout<<-1<<endl;elsecout<<now<<endl;}return 0;
}