아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

순열 변환

시간 제한1초메모리 제한512 MB

요약
순열 P가 주어질 때, P'[i] = P[P[i]] 변환을 반복해 얻을 수 있는 서로 다른 순열의 개수를 998244353으로 나눈 나머지로 구한다.
난이도

보통10점 중 7점

유형
수학, 조합론, 정수론, 구현
정답자
아직 제출이 없습니다

문제

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개이다.

  1. [3, 5, 1, 2, 4]
  2. [1, 4, 3, 5, 2]
  3. [1, 5, 3, 2, 4]

입력

첫 줄에 정수 N (1 ≤ N ≤ 100 000)이 주어지며, 이는 주어진 순열의 원소 개수이다. 다음 줄에 순열을 나타내는 N개의 정수 P[i] (1 ≤ P[i] ≤ N)가 주어진다. P[1...N]의 원소는 모두 다르다.

출력

주어진 순열에 변환을 0번 이상 적용해서 얻을 수 있는 서로 다른 순열의 개수를 998 244 353으로 나눈 나머지를 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    5
    3 5 1 2 4
    
    예상 출력
    3
    
  2. 예제 2

    입력
    8
    7 5 1 6 8 2 3 4
    
    예상 출력
    4