착신 전환 소동

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

요약
N대의 전화기가 각각 한 대로 착신 전환된 상태가 주어질 때, 자기 자신으로 향하지 않으면서 모든 정점이 순환에 속하도록 최소 개수의 전환을 바꾼 결과를 구한다.
난이도

보통10점 중 7점

유형
그래프, 그리디, 구현, 시뮬레이션
정답자
아직 제출이 없습니다

문제

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

그러나 해당 기능에는 큰 문제가 있는데, 착신 전환이 꼬이게 되면 일부 전화기가 먹통이 된다는 것이다! 예를 들어, 전화기 AA가 전화기 BB로, 전화기 BB가 전화기 CC로 착신 전환을 걸어 둔 상태에서 전화기 CC가 전화기 AA에 착신 전환을 걸어 두면 세 전화기 중 어떤 전화기에 전화를 걸어도 신호 대기 상태가 무한히 유지되며, 세 전화기 모두 먹통이 된다.

이 사실에 깊게 감명받은 도훈이는, 일부 전화기들의 착신 전환 상태를 바꿔 부대 내의 전화기 모두를 먹통으로 만들려는 사악한 계획을 세웠다! 부대 내에는 11번부터 NN번까지 총 NN대의 전화기가 있으며, 각 전화기는 a_ia\_i번 전화기로 착신 전환이 되어 있는 상태이다. 만약 a_i=ia\_i = i라면, ii번 전화기에는 착신 전환이 걸려 있지 않은 상태임을 의미한다.

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

입력

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

두 번째 줄에 각 전화기가 착신 전환으로 연결되어 있는 전화기의 번호를 의미하는 NN개의 정수 a_1,⋯ ,a_Na\_1,\cdots,a\_N이 공백으로 구분되어 주어진다. (1≤a_i≤N)(1\leq a\_i\leq N)

이때, a_i=ia\_i = i라면 ii번 전화기는 착신 전환이 되어 있지 않음을 의미한다.

출력

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

두 번째 줄에 착신 전환 상태를 바꾼 이후 각 전화기의 착신 전환 상태를 의미하는 NN개의 정수 b_1,⋯ ,b_Nb\_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