사이클 크기 모두 찾고 그 크기간의 최소공배수를 구하면 정답.
#include <bits/stdc++.h>
using namespace std;
constexpr int MAX = 20001;
int N;
int arr[MAX];
bool visited[MAX];
int gcd (int a, int b) {
    if (!b) return a;
    return gcd(b, a%b);
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> arr[i];
    }
    vector<int> v;
    for (int i = 1; i <= N; i++) {
        if (visited[i]) continue;
        visited[i] = true;
        int cur = i;
        int next = arr[i];
        int cnt = 1;
        while (next != cur) {
            visited[next] = true;
            cnt++;
            next = arr[next];
        }
        v.push_back(cnt);
    }
    long long lcm = 1;
    for (int& x : v) {
        // cout << x << ' ';
        lcm = lcm*x/gcd(lcm, x);
    }
    cout << lcm;
    return 0;
}
최소공배수를 구하기 위해 곱하는 과정에서 int 범위를 초과할 수 있다.