题目:
今天心情不好不写题目
题解:
仔细想想还是好生气啊!烦躁烦躁……
偶数/2,奇数直接LCM。
#include<iostream>
#include<cstring>
using namespace std;
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
const int INF=1e9+1;
int n;
bool vis[105];
int arr[101000];
int map[1010][1010];
void dfs(int rt,int x,int len){
map[rt][arr[x]]=len;
if(vis[arr[x]]) return ;
vis[x]=true;
dfs(rt,arr[x],len+1);
}
int main(){
for(int i=0;i<1010;i++){
for(int j=0;j<1010;j++){
map[i][j]=INF;
}
}
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
dfs(i,i,1);
}
int ans=1;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(map[i][j]==INF&&map[j][i]!=INF){
cout<<-1<<endl;
return 0;
}
if(map[i][j]!=INF&&map[j][i]==INF){
cout<<-1<<endl;
return 0;
}
if(map[i][j]==INF&&map[j][i]==INF) continue;
int length=map[i][j]+map[j][i];
if(length&1) ans=lcm(ans,length);
else ans=lcm(ans,length/2);
}
}
cout<<ans<<endl;
}