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\n",Ans);
    }

    return 0;
}
时间: 2024-10-17 10:58:44

POJ2369 Permutations【置换群】的相关文章

poj 2369 Permutations(置换群)

题目链接:poj 2369 Permutations 题意: 给你一个置换序列,问你循环周期是多少. 题解: 找到每个子循环周期,总体的循环周期就是这些子循环周期的最小公倍数. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define F(i,a,b) for(int i=a;i<=b;++i) 5 using namespace std; 6 7 const int N=1010

Uva 11077 Find the Permutations [置换群 DP]

题意: 给定$n$和$k$,问有多少排列交换$k$次能变成升序 $n \le 21$ $uva$貌似挂掉了$vjudge$上一直排队 从某个排列到$1,2,...,n$和从$1,2,...,n$到某个排列是一样的 排列就是置换,分解循环,然后显然每个循环变成升序需要$len-1$次交换 然后有$t$个循环的置换需要$n-t$次交换 $DP$就行了$f[i][j]$表示前$i$个数有$j$个循环 其实可以发现就是第一类$stirling$数 注意:以后一定要测一遍极限会爆$long\ long$

acm数学(待续)

意图写出http://www.cnblogs.com/kuangbin/archive/2012/08/28/2661066.html这个东西的完善版. 1.置换,置换的运算 poj 2369 Permutations置换群中有一个定理:设T为一置换,e为单位置换,T^k=e,那么k的最小正整数解是T的拆分的所有循环长度的最小公倍数. 1 #include <cstdio> 2 const int maxn = 1005; 3 int gcd(int a,int b){return b ==

hdu5338(2015多校4)--ZZX and Permutations(置换群)

题目链接:点击打开链接 题目大意:给出一个序列,分成若干个置换群,要求最终的序列的字典序最大. 要求字典序最大,那么从1开始向后遍历,尽量放较大的数 给出序列a1 a2 a3 ,,, ai   an 对于第i个数来说,可能有三种情况,第一种向前找能到达的序列的最大值ak,那么ak到ai就是一个轮换:第二种ai自身,或者是以ai结尾:第三种由i想后找,对于轮换来说,只能在i位置放ai+1,那么ai和ai+1只能构成轮换的一部分:在这三种可以放的值中选出最大值,也就是第i个位置能放的数 注意 1.当

poj 2369(置换群)

Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3041   Accepted: 1641 Description We remind that the permutation of some final set is a one-to-one mapping of the set onto itself. Less formally, that is a way to reorder eleme

poj2369

Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2549   Accepted: 1336 Description We remind that the permutation of some final set is a one-to-one mapping of the set onto itself. Less formally, that is a way to reorder eleme

HDU 4985 Little Pony and Permutation(数学 置换群)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4985 置换群:http://baike.baidu.com/view/1879054.htm?fr=aladdin Little Pony and Permutation Problem Description As a unicorn, the ability of using magic is the distinguishing feature among other kind of pony

置换群学习笔记

群论是数学分支之一,在OI中的运用主要在于置换群和Burnside引理,polya定理. http://blog.csdn.net/liangzhaoyang1/article/details/72639208 http://blog.csdn.net/gengmingrui/article/details/50564027 http://www.cnblogs.com/candy99/category/955780.html https://files.cnblogs.com/files/Ho

Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example,[1,1,2] have the following unique permutations: [ [1,1,2], [1,2,1], [2,1,1] ] 分析: 全组合的思想,保证start和end之间交换的时候中间没有与end相同的数字 class Solution