题目1 : 数组重排
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
3 2 3 1
样例输出
-
3
描述
小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序?
具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位置上。例如对于 P = (2, 3, 1),假设初始数组是(1, 2, 3),重排一次之后变为(3, 1, 2),重排两次之后变为(2, 3, 1),重排三次之后变回(1, 2, 3)。
被排数组中的元素可以认为是两两不同的。
输入
第一行一个整数 N ,代表数组的长度。 (1 ≤ N ≤ 100)
第二行N个整数,代表1 - N 的一个排列 P 。
输出
输出最少重排的次数。
#include<iostream>
#include<string>
#include<cstring>
#include<stdio.h>
#include<vector>
#include <algorithm>
#include<math.h>
using namespace std;
int gb(int x,int y)
{
int a=x,b=y;
int c=a%b;
while(c!=0)
{
a=b;
b=c;
c=a%b;
}
return x/b*y;
}
int main()
{
int a[110]={0};
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ss=1;
for(int i=1;i<=n;i++)
{
int s=1;
int t=a[i];
while(t!=i)//i回到原位置次数
{
t=a[t];
s++;
}
ss=gb(ss,s);
}
printf("%d\n",ss);
}