만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

착신 전환 소동

면접 대비

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

요약
각 전화의 착신 전환 대상이 주어질 때, 모든 전화가 두 대 이상으로 이루어진 순환에 빠지도록 바꿀 설정의 최소 개수와 새 설정을 구합니다.
난이도

쉬움10점 중 3점

유형
그래프, 구현
정답자
아직 제출이 없습니다

문제

도훈이네 부대의 전화기에는 착신 전환이라는 기능이 있다. 착신 전환은 전화기에 걸려 오는 전화를 다른 전화기로 대신 연결하는 기능이다. 가령 전화기 AA가 전화기 BB로 착신 전환을 했다면, 전화기 AA에 전화를 걸었을 때 전화기 BB에 전화가 걸려 온다. 전화기마다 착신 전환은 최대 하나의 전화기로만 설정할 수 있다.

이 기능에는 큰 문제가 있다. 착신 전환이 순환을 이루면 일부 전화기가 먹통이 된다. 예를 들어 전화기 AA가 BB로, BB가 CC로, CC가 AA로 착신 전환을 걸어 두면, 세 전화기 중 어느 것에 전화를 걸어도 신호 대기 상태가 무한히 유지되고 세 전화기 모두 먹통이 된다.

이 사실에 깊은 인상을 받은 도훈이는 일부 전화기의 착신 전환 상태를 바꿔 부대 내 전화기를 모두 먹통으로 만들려는 계획을 세웠다. 부대에는 11번부터 NN번까지 NN대의 전화기가 있으며, 전화기 ii는 현재 aia_i번 전화기로 착신 전환이 되어 있다. ai=ia_i = i라면 전화기 ii에는 착신 전환이 걸려 있지 않다.

착신 전환 상태를 너무 많이 바꾸면 간부님께 걸릴 것이 분명하므로, 상태를 바꿀 전화기 수는 최소여야 한다. 상태를 바꿔야 하는 최소 전화기 수와 바뀐 착신 전환 상태를 구하라. 가능한 상태가 여러 가지라면 그중 아무거나 구해도 된다. 모든 전화를 먹통으로 만드는 것이 항상 가능함을 증명할 수 있다.

입력

첫 번째 줄에 부대 내 전화기의 대수 NN이 주어진다. (2≤N≤100 0002\leq N\leq 100\,000)

두 번째 줄에 각 전화기가 착신 전환으로 연결된 전화기의 번호를 뜻하는 정수 a1,⋯ ,aNa_1, \cdots, a_N이 공백으로 구분되어 주어진다. (1≤ai≤N1\leq a_i\leq N)

ai=ia_i = i이면 ii번 전화기에는 착신 전환이 걸려 있지 않다.

출력

첫 번째 줄에 모든 전화를 먹통으로 만들기 위해 착신 전환 상태를 바꿔야 하는 최소 전화기 수를 출력한다.

두 번째 줄에 착신 전환 상태를 바꾼 뒤 각 전화기의 상태를 뜻하는 정수 b1,⋯ ,bNb_1, \cdots, b_N을 출력한다. 가능한 상태가 여러 가지라면 그중 아무거나 출력한다.

예제3

  1. 예제 1

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

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

    입력
    4
    4 4 4 4
    
    예상 출력
    1
    4 4 4 3