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

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

2의 거듭제곱 구간 교환

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

요약
시작 위치가 블록 크기의 배수인 블록 교환을 크기마다 최대 한 번씩만 사용해 주어진 순열을 정렬하는 교환 순서의 개수를 셉니다.
난이도

어려움10점 중 8점

유형
분할 정복, 재귀, 조합론
정답자
아직 제출이 없습니다

문제

평행 우주의 사람들은 2의 거듭제곱을 좋아해서, 11부터 2N2^N까지의 순열을 제한된 교환 하나만으로 정렬한다. 위치는 00번부터 센다.

크기가 kk인 올바른 구간은 연속한 위치 2k2^k개로 이루어지고 첫 위치가 2k2^k의 배수인 구간이다. 크기가 kk인 교환은 서로 다른 두 올바른 구간의 내용을 통째로 맞바꾼다. 한 구간을 자기 자신과 맞바꿀 수는 없다.

순열을 정렬할 때 크기가 kk인 교환은 k=0,1,…,N−1k = 0, 1, \dots, N-1마다 최대 한 번씩만 쓸 수 있다.

예를 들어 11부터 232^3까지의 순열 [3, 6, 1, 2, 7, 8, 5, 4]는 다음처럼 정렬된다.

  • [3, 6, 1, 2, 7, 8, 5, 4]: 크기가 22인 교환으로 [3, 6, 1, 2]와 [7, 8, 5, 4]를 맞바꾼다.
  • [7, 8, 5, 4, 3, 6, 1, 2]: 크기가 00인 교환으로 [5]와 [3]을 맞바꾼다.
  • [7, 8, 3, 4, 5, 6, 1, 2]: 크기가 11인 교환으로 [7, 8]과 [1, 2]를 맞바꾼다.
  • [1, 2, 3, 4, 5, 6, 7, 8]: 정렬이 끝났다.

크기 00, 11, 22를 각각 최대 한 번씩만 썼고, 모든 구간이 자기 크기의 배수인 위치에서 시작했다.

이 규칙으로 주어진 순열을 정렬하는 방법의 수를 세어라. 한 방법은 교환을 순서대로 나열한 것이고, 나열이 완전히 같을 때만 두 방법이 같다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스는 두 줄이다. 첫 줄에 정수 NN이 주어지고, 다음 줄에 1,2,…,2N1, 2, \dots, 2^N의 순열을 이루는 정수 2N2^N개가 공백으로 구분되어 주어진다.

  • 1≤T≤2001 \le T \le 200
  • 1≤N≤121 \le N \le 12

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. x는 11부터 시작하는 테스트 케이스 번호이고, y는 주어진 순열을 정렬하는 방법의 수이다.

예제2

  1. 예제 1

    입력
    4
    1
    2 1
    2
    1 4 3 2
    3
    7 8 5 6 1 2 4 3
    2
    4 3 2 1
    
    예상 출력
    Case #1: 1
    Case #2: 3
    Case #3: 6
    Case #4: 0
    
  2. 예제 2

    입력
    6
    1
    1 2
    1
    2 1
    2
    1 2 3 4
    2
    2 4 1 3
    2
    1 3 4 2
    2
    3 4 1 2
    
    예상 출력
    Case #1: 1
    Case #2: 1
    Case #3: 1
    Case #4: 2
    Case #5: 0
    Case #6: 1