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

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

순열에 관한 또 다른 문제

시간 제한3초메모리 제한256 MB

요약
순열이 주어질 때, 길이 1 또는 2인 순환만 가진 단순 순열들의 곱으로 최소 개수만큼 표현하고, 최적 분해 하나를 출력한다.
난이도

어려움10점 중 8점

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

문제

이 문제는 순열에 관한 것이다. 아래에 나오는 용어가 익숙하지 않다면 예제 뒤의 힌트를 참고하라.

순열 pp의 모든 사이클의 길이가 2 이하이면 pp를 단순(simple)하다고 한다. 예를 들어 순열 2,1,4,32, 1, 4, 3은 단순하지만, 순열 3,1,23, 1, 2는 단순하지 않다.

순열 pp가 주어진다. pp를 최소 개수의 단순한 순열의 곱으로 나타내라.

입력

첫 번째 줄에는 테스트 케이스의 수 TT가 주어진다 (1≤T≤1051 \le T \le 10^5).

다음 TT개의 줄에는 각각 하나의 테스트 케이스가 주어진다. 각 테스트 케이스는 순열 pp의 길이 nn (1≤n≤1051 \le n \le 10^5)과 nn개의 서로 다른 정수 p1,p2,…,pnp_1, p_2, \ldots, p_n으로 이루어진다. 이 정수들은 순열 pp 자체이다 (1≤pi≤n1 \le p_i \le n, 11부터 nn까지의 각 수가 순열에 정확히 한 번씩 나타난다).

입력에 주어지는 모든 순열의 길이의 합은 10610^6 이하이다.

출력

각 테스트 케이스마다, 곱에 들어가는 단순한 순열의 최소 개수 kk를 한 줄에 출력한다. 그다음 kk개의 줄에 단순한 순열 q(1),q(2),…,q(k)q^{(1)}, q^{(2)}, \ldots, q^{(k)}를 한 줄에 하나씩 출력한다. 이 중 ii번째 줄에는 11부터 nn까지의 서로 다른 정수 nn개로 순열 q(i)q^{(i)}를 나타낸다. 곱 q(1)∘q(2)∘…∘q(k)q^{(1)} \circ q^{(2)} \circ \ldots \circ q^{(k)}는 pp와 같아야 한다.

최적해가 여러 개라면 아무거나 하나를 출력하면 된다.

힌트

길이 nn의 순열은 11부터 nn까지의 각 정수가 정확히 한 번씩 나타나는, 길이 nn의 정수 수열이다.

순열 pp의 사이클은 11부터 nn까지의 서로 다른 정수 i1,i2,…,iti_1, i_2, \ldots, i_t의 수열로서 pi1=i2p_{i_1} = i_2, pi2=i3p_{i_2} = i_3, …\ldots, pit−1=itp_{i_{t - 1}} = i_t이고 pit=i1p_{i_t} = i_1을 만족한다. 정수 t≥1t \ge 1을 그 사이클의 길이라고 한다.

두 순열 aa와 bb의 곱 a∘ba \circ b는 모든 ii에 대해 ci=abic_i = a_{b_i}인 순열 cc이다. 예를 들어 a=3 2 1a = 3 \, 2 \, 1이고 b=1 3 2b = 1 \, 3 \, 2이면, 그 곱은 a∘b=3 1 2a \circ b = 3 \, 1 \, 2이다.

세 개 이상의 순열의 곱은 어떤 순서로 계산해도 결과가 같다. 예를 들어 a∘b∘c=(a∘b)∘c=a∘(b∘c)a \circ b \circ c = (a \circ b) \circ c = a \circ (b \circ c)이다.

예제1

  1. 예제 1

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