hihocoder1330 数组重排

题意:一个数组,每次把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\n", ans);
    return 0;
}

 

posted on 2017-09-09 21:20  2855669158  阅读(80)  评论(0编辑  收藏  举报

导航