题意:一个数组,每次把i位置的数移到pi位置,问要几次可以将数组重新排列回来
题解:计算每个数的周期,所有数的周期的lcm就是答案,复杂度O(n*n),一个循环里面的数周期都是一样的,标记一下,复杂度o(n)
#include <bits/stdc++.h> #define maxn 110 #define ll long long using namespace std; ll a[maxn], dir[maxn]; map<ll,ll>mp; int main(){ ll n, t, num=0, ans=1; scanf("%lld", &n); for(ll i=1;i<=n;i++) scanf("%lld", &a[i]); for(ll i=1;i<=n;i++){ num = 0;t = a[i]; if(dir[t] == 1) continue; mp.clear(); while(!mp[t]){ mp[t] = 1; t = a[t]; dir[t] = 1; num++; } ans = ans*num/__gcd(ans, num); } printf("%lld ", ans); return 0; }