题目: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;
}