题意如标题
对于每一位,算出最少的置换到自己应该的数字。
每一位都有这样的数字,取最小公倍数就可以。因为每一位数都有自己的循环节,要达到原始有序位置就相当于所有的位置有回到原位置,就是最小公倍数
#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;
}
本文讨论了如何利用最小公倍数解决置换问题,通过实例解释了求解置换周期的方法,包括最大公约数、最小公倍数的计算及在实际问题中的应用。
5041

被折叠的 条评论
为什么被折叠?



