加载中…
个人资料
JosiahChiu
JosiahChiu
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,096
  • 关注人气:87
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 2369 置换群 循环节

(2010-08-12 10:28:47)
标签:

poj

pku

2369

置换群

循环节

it

分类: 杂题

题目描述:问置换多少次变成有序序列。

解题报告:

对于每一位,算出最少的置换到自己应该的数字。

每一位都有这样的数字,取最小公倍数就可以。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n, x[1001];
int lcm(int a, int b)
{
    if (a == b) return a;
    if (a < b) swap(a, b);
    int i = 2, ans = a;
    while(ans % b != 0) ans = a * (i++);
    return ans;
}
int main()
{
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 1; i <= n; i++) scanf("%d", &x[i]); int ans = 1;
        for(int i = 1; i <= n; i++)
        {
            int tmp = x[i], num = 1;
            while(tmp != i)
            {
                tmp = x[tmp];
                num++;
            }
            ans = lcm(ans, num);
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有