题目链接:点击打开链接
思路:
很简单的一道题, 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("-1n"); 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("%dn", ans);return 0;
}
本文发布于:2024-02-04 21:39:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717036859858.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |