#include <fstream>
#define I_F "officer.in"
#define O_F "officer.out"
#define MAX 10001
using namespace std;
int h[MAX],s[MAX];
int n,m;
long long ans;
void Input();
void Dfs();
long long max(long long a, long long b);
long long min(long long a, long long b);
long long lcm(long long a, long long b);
void Search();
void Output();
int main()
{
Input();
Dfs();
Search();
Output();
return 0;
}
void Input()
{
ifstream fin(I_F);
fin>>n;
for (int i=1; i<=n; fin>>s[i++]);
fin.close();
}
void Dfs()
{
bool f[MAX]={false};
int i,j,t;
for (i=1; i<=n; i++)
if (!f[i])
{
t=0;
for (j=i; !f[j]; j=s[j])
{
t++;
f[j]=true;
}
h[m++]=t;
}
}
long long max(long long a, long long b)
{
if (a>b)
return a;
else
return b;
}
long long min(long long a, long long b)
{
if (a<b)
return a;
else
return b;
}
long long lcm(long long a, long long b)
{
long long t1=max(a,b), t2=min(a,b);
int i;
for (i=1; i<=t2; i++)
if (t1*i%t2==0)
return t1*i;
}
void Search()
{
ans=h[0];
int i;
for (i=1; i<m; i++)
ans=lcm(ans,h[i]);
}
void Output()
{
ofstream fout(O_F);
fout<<ans<<'\n';
fout.close();
}