Walaweh
시간 제한1초메모리 제한128 MB
왈라웨 목록 W_L은 W_{L-1}에 8단계 주기로 되풀이되는 추가/선두 삽입과 선택적 뒤집기 연산을 적용해 만든다. (길이, 순번)과 이진 문자열을 서로 변환하는 문제로, 재귀는 단계마다 O(log N)이면 충분하지만 뒤집기와 선행 0 처리 때문에 순번 비트 매핑이 간단하지 않다.
문제
Walaweh 수는 일부러 성가시게 만든 번호 매기기 수열의 한 항목입니다. 이름도 바로 그 성가심에서 왔습니다("Walaweh!"). Walaweh 수는 0과 1만 사용한다는 점에서 이진수처럼 보이지만, 보통의 이진수와 달리 자릿수(길이)가 중요해서 앞자리의 0을 그대로 보존합니다. 여기서 Walaweh 수의 길이란 단순히 자릿수를 뜻합니다.
표기를 간단히 하기 위해, 길이가 인 Walaweh 수들을 로 씁니다. 이는 정확히 자리인 모든 Walaweh 수를 순서대로 나열한 목록입니다. 가장 작은 은 고정되어 있으며, 순서대로 "0"과 "1" 두 수입니다. 일 때 은 로부터 만들어집니다. 먼저 의 복제본 과 를 만들고, 아래에서 정한 연산 하나를 적용해 이들을 각각 과 로 바꾼 뒤, 목록 다음에 목록 를 이어 붙이면 이 됩니다.
과 에 적용할 수 있는 연산은 다음 8가지입니다.
- 의 모든 수 끝에 숫자 0을 붙이고, 의 모든 수 끝에 숫자 1을 붙입니다.
- 의 모든 수 앞에 숫자 0을 붙이고, 의 모든 수 앞에 숫자 1을 붙입니다.
- 의 모든 수 끝에 숫자 1을 붙이고, 의 모든 수 끝에 숫자 0을 붙입니다.
- 의 모든 수 앞에 숫자 1을 붙이고, 의 모든 수 앞에 숫자 0을 붙입니다.
- 목록 의 순서를 뒤집은 다음 연산 1을 적용합니다.
- 목록 의 순서를 뒤집은 다음 연산 2를 적용합니다.
- 목록 의 순서를 뒤집은 다음 연산 3을 적용합니다.
- 목록 의 순서를 뒤집은 다음 연산 4를 적용합니다.
연산은 순환하며 반복됩니다. 은 고정입니다. 는 에 연산 1을, 은 에 연산 2를 적용해 얻으며, 이런 식으로 진행하다가 연산 8 다음에는 다시 연산 1로 돌아갑니다. 따라서 는 에 연산 8을, 은 에 연산 1을 적용한 결과이고, 이후로도 같은 방식으로 이어집니다. Walaweh!
다음은 , , , 입니다.
연산 5~8에서 쓰이는 "목록 의 순서 뒤집기"를 보여 주기 위해, 의 마지막 5개 수를 제시합니다.
길이와 순번이 주어지면 Walaweh 수를 구하고, 반대로 Walaweh 수가 주어지면 순번을 구하세요.
입력
입력은 하나 이상의 질의로 이루어지며, 각 질의는 한 줄에 하나씩 파일 끝까지 주어집니다. 각 줄은 다음 두 형식 중 하나입니다.
Walaweh L N— 길이 ()과 순번 ().Sequence S— Walaweh 수의 이진 문자열 이며, 그 길이는 64 미만입니다(길이는 자체로부터 알 수 있습니다).
출력
Walaweh L N 줄에 대해서는 길이가 인 Walaweh 수 중 번째 수를, 앞자리 0을 그대로 포함해 정확히 자리로 출력하세요. Sequence S 줄에 대해서는 Walaweh 수 의 순번을 출력하세요. 각 입력 줄마다 한 개의 답을 입력과 같은 순서로 출력합니다.