题意: 给你个1到n的序列p,每次将所有数移动,第i个数移动到p[i]位置上 ,问最少几次操作,使得 所有 i==p[i]
其实想想也就是 第I个数按照规则移动,会再次回到 i的位置上,需要几次, 要保证所有数同时回到自己位置上,就是要求每个数移动次数的最小公倍数就行了
#include<bits/stdc++.h>
using namespace std;
long long a[101];
long long len ;
long long gcd(long long x,long long y)
{
return x%y==0?y:gcd(y,x%y);
}
long long lcm(long long x,long long y)
{
return x*y/gcd(x,y);
}
int main()
{
long long n;
scanf("%d",&n);
for(long long i = 1; i<=n; i++)
scanf("%d",&a[i]);
long long flag =1;
if(n==1)
{
printf("0\n");
return 0;
}
for(long long i =1 ; i<=n; i++)
{
if(a[i]!=i) flag =1;
}
if(flag==0)
{
printf("1\n");
return 0;
}
memset(vis,0,sizeof(vis));
long long ans = 1;
for(long long i = 1; i<=n; i++)
{
if(i==a[i])continue;
long long p = i;
long long len = 1;
p = a[i];
while(p!=i)
{
p = a[p];
len++;
}
ans = lcm(ans, len);
}
cout<<ans<<endl;
}