func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> x[100000], G[100000];   int n, a[100000], col[100000], cnt, p[2001][1000];   long long ret = 1, ret2 = 0;   long long gcd(long long r, long long s) {     if (s == 0) return r;     return gcd(s, r % s);   }   void dfs(int pos) {     if (col[pos] >= 1) return;     col[pos] = cnt;     G[cnt].push_back(pos);     for (int i = 0; i < x[pos].size(); i++) dfs(x[pos][i]);   }   int main() {     cin >> n;     for (int i = 0; i < n; i++) {       cin >> a[i];       a[i]--;       x[i].push_back(a[i]);       x[a[i]].push_back(i);     }     for (int i = 0; i < n; i++) {       if (col[i] >= 1) continue;       cnt++;       dfs(i);     }     for (int i = 1; i <= cnt; i++) {       for (int j = 0; j <= 2000; j++) {         for (int k = 0; k < 1000; k++) p[j][k] = 0;       }       for (int j : G[i]) p[0][j] = j;       for (int j = 0; j < 2000; j++) {         for (int k : G[i]) {           p[j + 1][k] = a[p[j][k]];         }       }       long long cnt2 = 0, cnt3 = 0;       for (int j = 1; j <= 1000; j++) {         bool OK = true;         for (int k = 0; k < n; k++) {           if (p[j][k] != p[2 * j][k]) OK = false;         }         if (OK == true) {           if (cnt2 == 0)             cnt2 = j;           else {             cnt3 = j;             break;           }         }       }       ret = ret / gcd(ret, cnt3 - cnt2) * (cnt3 - cnt2);       ret2 = max(ret2, cnt2);     }     long long B = ret;     while (ret2 > B) B += ret;     cout << B << endl;     return 0;   }   