首页 > 其他分享 >POJ2369 置换群

POJ2369 置换群

时间:2023-05-31 18:38:54浏览次数:55  
标签:POJ2369 return gcd int 置换 序列 include 置换群


题目: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,return,gcd,int,置换,序列,include,置换群
From: https://blog.51cto.com/u_16146153/6388733

相关文章