题目链接:点击打开链接
思路:
很简单的一道题, dfs之后求n个数的lcm就行了, 从网上扒下来一个lcm,mdzz死循环了。。不对的代码你贴个XX
细节参见代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <ctime>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const double PI = acos(-1);
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 1e2 + 10;
int T,n,m,x,a[maxn];
int cnt[maxn], res[maxn];
bool vis[maxn];
ll ans = 0;
bool dfs(int id, int cur, int d) {
if(a[cur] == id) {
cnt[id] = d;
return true;
}
if(vis[cur]) return false;
vis[cur] = true;
if(dfs(id, a[cur], d+1)) return true;
return false;
}
ll gcd(ll a,ll b){
if(b) return gcd(b,a%b);
return a;
}
ll lcm(ll x,ll y)
{
return (x*y)/gcd(x,y);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
ans = 0;
bool ok = true;
for(int i = 1; i <= n; i++) {
memset(vis, false, sizeof(vis[0])*(n+1));
if(!dfs(i, i, 1)) { ok = false; break; }
}
if(!ok) { printf("-1\n"); return 0; }
for(int i = 1; i <= n; i++) {
memset(vis, false, sizeof(vis[0])*(n+1));
if(cnt[i] & 1) {
res[i] = cnt[i];
}
else {
res[i] = cnt[i]/2;
}
}
for(int i = 1; i <= n; i++) {
if(i == 1) ans = res[i];
else ans = lcm(ans, (ll)res[i]);
}
printf("%d\n", ans);
return 0;
}