欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CF 742C

程序员文章站 2022-05-16 18:36:35
...

题目:

今天心情不好不写题目

题解:

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

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