https://atcoder.jp/contests/past202004-open/tasks/past202004_e
解説
https://atcoder.jp/contests/past202004-open/submissions/12895699
各整数iについて、操作をシミュレーションして、条件を満たす整数jを答える。
そのまま、配列Aを受け取ると、「A[x] := xから1回の操作を行った後の値」となっている。
0-indexedでやっている場合は、A[x]--をしておこう。
これで、シミュレーションをしていく。
条件はx != iであるなら操作を継続するようにやっていけばいい。
初期状態をx=iとしてしまうと、操作を継続できないので、最初の1手だけ最初に行う。
これで各iについて、それぞれ答えれば答え。
int N, A[101]; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; rep(i, 0, N) cin >> A[i], A[i]--; rep(i, 0, N) { int x = A[i]; int j = 1; while (x != i) { x = A[x]; j++; } if(i) printf(" "); printf("%d", j); } printf("\n"); }