题意如标题
对于每一位,算出最少的置换到自己应该的数字。
每一位都有这样的数字,取最小公倍数就可以。因为每一位数都有自己的循环节,要达到原始有序位置就相当于所有的位置有回到原位置,就是最小公倍数
#include <stdlib.h>
#include <cstring>
#include <iostream>
#define MAX 2005
using namespace std;
typedef __int64 lld;
int key[MAX], t[MAX];
/* 求解置换周期 */
void get_time(int n)
{
int i, j, count;
for (i = 1; i <= n; i++)
{
j = key[i];
count = 1;
/* 直到轮回 */
while(i != j)
{
count++;
j = key[j];
}
t[i] = count;
}
}
int gcd ( int a, int b)//最大公约数
{
if ( b == 0 ) return a;
else
return gcd ( b, a % b );
}
int Lcm ( int a, int b )//最小公倍数
{
return a / gcd ( a, b )* b;//先除后乘
}
int main()
{
int i, j, m, n, len;
//char src[MAX], dst[MAX];
int final[MAX];
while(scanf("%d", &n)!=EOF)
{
if (n == 0) break;
for (i = 1; i <= n; i++)
{
scanf("%d", &key[i]);
}
/* 初始化周期数组 */
memset(t, 0, sizeof(t));
get_time(n);
for(i=2;i<=n;i++)
{
t[i]=Lcm(t[i],t[i-1]);
}
printf("%d\n",t[n]);
}
return 0;
}