$O(n\lg C)$
모든 사이클 크기의 최소공배수를 구한다.
#include<cstdio> int n, a[20001], ck[20001], r = 1; int gcd(int x, int y) { return y ? gcd(y, x%y) : x; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", a + i); for (int i = 1; i <= n; i++) { int j = i, cnt = 0; for (; !ck[j]; j = a[j]) ck[j] = 1, cnt++; if (cnt) r = 1LL * r*cnt / gcd(r, cnt); } printf("%d", r); return 0; }
댓글 없음 :
댓글 쓰기