순열 변환
시간 제한1초메모리 제한512 MB
순열 P가 주어질 때, P'[i] = P[P[i]] 변환을 반복해 얻을 수 있는 서로 다른 순열의 개수를 998244353으로 나눈 나머지로 구한다.
문제
1부터 N까지의 순열 P[1...N]은 1부터 N까지의 각 정수가 P[1...N]에 정확히 한 번씩 나타나는 정수 배열이다. P[1...N]에 대한 변환은 P[1...N]을 또 다른 순열 P'[1...N]으로 바꾸는 것으로, 모든 1 ≤ i ≤ N에 대해 P'[i] = P[P[i]]이다.
순열 P[1...N]이 주어진다. 이 문제에서 할 일은 주어진 순열에 변환을 0번 이상 적용해서 얻을 수 있는 서로 다른 순열의 개수를 세는 것이다.
예를 들어 P[1...N] = [3, 5, 1, 2, 4]라고 하자.
- 변환을 한 번 적용하면 P는 [1, 4, 3, 5, 2]가 된다.
- 변환을 한 번 더 적용하면 P는 [1, 5, 3, 2, 4]가 된다.
- 변환을 한 번 더 적용하면 P는 다시 [1, 4, 3, 5, 2]가 된다.
따라서 변환을 0번 이상 적용해서 얻을 수 있는 서로 다른 순열은 3개이다.
- [3, 5, 1, 2, 4]
- [1, 4, 3, 5, 2]
- [1, 5, 3, 2, 4]
입력
첫 줄에 정수 N (1 ≤ N ≤ 100 000)이 주어지며, 이는 주어진 순열의 원소 개수이다. 다음 줄에 순열을 나타내는 N개의 정수 P[i] (1 ≤ P[i] ≤ N)가 주어진다. P[1...N]의 원소는 모두 다르다.
출력
주어진 순열에 변환을 0번 이상 적용해서 얻을 수 있는 서로 다른 순열의 개수를 998 244 353으로 나눈 나머지를 한 줄에 출력한다.