分析:
求一个置换的最小循环节
因为不大明白题目描述
所以就手玩了一下:
将序列拆成若干个轮换后,
对于一个大小为
X
X
的轮换中的一个位置,需要
(X−1)
(
X
−
1
)
次置换才能把
x
x
换到位置上
我们要使序列有序,实际上就是使
a[i]=i
a
[
i
]
=
i
因此我们只要求出所有位置换成目标状态需要的次数的
lcm
l
c
m
即可
即
lcm(size轮换)
l
c
m
(
s
i
z
e
轮
换
)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1010;
int n,a[N];
int gcd(int x,int y)
{
int r=x%y;
while (r)
{
x=y; y=r;
r=x%y;
}
return y;
}
int lcm(int x,int y)
{
return x/gcd(x,y)*y;
}
int main()
{
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 x=a[i],l=1;
while (x!=i)
{
l++;
x=a[x];
}
ans=lcm(ans,l);
}
printf("%d",ans);
return 0;
}