HihoCoder 1330 数组重排

题目链接


将重排方式看作是m个置换,求每个置换群内元素个数的最小公倍数

并查集处理出每个置换内的元素


#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int n,a[150];
int fa[150],sum[150];
int find(int x)
{
    if(x == fa[x]) return x;
    else
    {
        return fa[x] = find(fa[x]);
    }
}
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a%b);
}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for(int i = 0; i <= n; i++)
        fa[i] = i, sum[i] = 1;
    for(int i = 1; i <= n; i++)
    {
        int x = find(i), y = find(a[i]);
        if(x != y)
        {
            fa[x] = y;
            sum[y] += sum[x];
        }
    }
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        if(fa[i] == i)
        {
            int g = gcd(ans, sum[i]);
            if(ans == 0) ans = g;
            else ans = sum[i]*ans/g;
        }
    }
    printf("%d\n", ans);
    return 0;
}
posted @ 2017-09-13 00:22  可达龙  阅读(166)  评论(0编辑  收藏  举报