zoukankan      html  css  js  c++  java
  • POJ2369 Permutations【置换群】

    题目链接:

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


    题目大意:

    给定一个序列。问最少须要多少次置换才干变为 1、2、…、N 的有序序列。比方说给

    定5个数的序列 4 1 5 2 3。表示置换为:

    ( 1 2 3 4 5 ) ,即 (1 4 2)(3 5)

      4 1 5 2 3


    解题思路:

    对于每一位找到自己轮换内轮换到自己的次数。求不相交的轮换之间的次数的公倍数,

    即为终于结果。


    AC代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int GCD(int a,int b)
    {
        if(b == 0)
            return a;
        return GCD(b,a%b);
    }
    
    int LCM(int a,int b)
    {
        return a / GCD(a,b) * b;
    }
    
    int A[1100],vis[1100];//vis[]标记轮换
    
    int main()
    {
        int N;
        while(~scanf("%d",&N))
        {
            memset(vis,0,sizeof(vis));
            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;
                vis[i] = 1;
                while(tmp != i && !vis[tmp])
                {
                    vis[tmp] = 1;
                    tmp = A[tmp];
                    Num++;
                }
                Ans = LCM(Ans,Num);
            }
            printf("%d
    ",Ans);
        }
    
        return 0;
    }
    


  • 相关阅读:
    Win10 UWP程序内的文件格式
    第一章
    英语
    BOM
    html基础
    协程
    python
    列表 元组 range
    我的Python学习笔记(四):动态添加属性和方法
    我的Python学习笔记(三):私有变量
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6992243.html
Copyright © 2011-2022 走看看