순열에 관한 또 다른 문제
시간 제한3초메모리 제한256 MB
순열이 주어질 때, 길이 1 또는 2인 순환만 가진 단순 순열들의 곱으로 최소 개수만큼 표현하고, 최적 분해 하나를 출력한다.
문제
이 문제는 순열에 관한 것이다. 아래에 나오는 용어가 익숙하지 않다면 예제 뒤의 힌트를 참고하라.
순열 의 모든 사이클의 길이가 2 이하이면 를 단순(simple)하다고 한다. 예를 들어 순열 은 단순하지만, 순열 는 단순하지 않다.
순열 가 주어진다. 를 최소 개수의 단순한 순열의 곱으로 나타내라.
입력
첫 번째 줄에는 테스트 케이스의 수 가 주어진다 ().
다음 개의 줄에는 각각 하나의 테스트 케이스가 주어진다. 각 테스트 케이스는 순열 의 길이 ()과 개의 서로 다른 정수 으로 이루어진다. 이 정수들은 순열 자체이다 (, 부터 까지의 각 수가 순열에 정확히 한 번씩 나타난다).
입력에 주어지는 모든 순열의 길이의 합은 이하이다.
출력
각 테스트 케이스마다, 곱에 들어가는 단순한 순열의 최소 개수 를 한 줄에 출력한다. 그다음 개의 줄에 단순한 순열 를 한 줄에 하나씩 출력한다. 이 중 번째 줄에는 부터 까지의 서로 다른 정수 개로 순열 를 나타낸다. 곱 는 와 같아야 한다.
최적해가 여러 개라면 아무거나 하나를 출력하면 된다.
힌트
길이 의 순열은 부터 까지의 각 정수가 정확히 한 번씩 나타나는, 길이 의 정수 수열이다.
순열 의 사이클은 부터 까지의 서로 다른 정수 의 수열로서 , , , 이고 을 만족한다. 정수 을 그 사이클의 길이라고 한다.
두 순열 와 의 곱 는 모든 에 대해 인 순열 이다. 예를 들어 이고 이면, 그 곱은 이다.
세 개 이상의 순열의 곱은 어떤 순서로 계산해도 결과가 같다. 예를 들어 이다.