CF 742C

题目:

今天心情不好不写题目

题解:

仔细想想还是好生气啊!烦躁烦躁……

偶数/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;
}

猜你喜欢

转载自blog.csdn.net/mengwuyaaa/article/details/80092949