POJ2369 置换群

题目:http://poj.org/problem?id=2369


题意:给定一个序列,问需要最少需要置换多少次才能变为有序序列.


分析:对于每一位,算出最少的置换到自己应该的数字。每一位都有这样的数字,取最小公倍数就可以。


#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 1005;

int a[N];

int gcd(int a,int b)
{
    return b ? gcd(b,a%b):a;
}

int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int ans = 1;
        for(int i=1;i<=n;i++)
        {
            int tmp = a[i];
            int num = 1;
            while(tmp != i)
            {
                tmp = a[tmp];
                num++;
            }
            ans = lcm(ans,num);
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(POJ2369 置换群)