우로보로스 뱀

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

요약
n과 k가 주어질 때, 크기 n의 가장 작은 오우로보로스 수로 만든 드 브루인 원에서 위치 k부터 시작하는 n비트 값을 구한다.
난이도

어려움10점 중 8점

유형
조합론, 비트 연산, 구현, 수학
정답자
아직 제출이 없습니다

문제

우로보로스(Ouroboros)는 고대 이집트 신화에 나오는 뱀으로, 자신의 꼬리를 물고 끊임없이 스스로를 삼킨다.

우로보로스 수(Ouroboros number)는 2n2^n개의 비트로 이루어진 이진수 중에서 00부터 2n−12^n-1까지의 모든 수를 "생성"하는 성질을 가진 수이다. 생성 과정은 다음과 같다. 우로보로스 수의 2n2^n개 비트를 원형으로 배치한 뒤, 시작 위치를 한 칸씩 옮겨 가며 원을 따라 연속한 nn개의 비트 묶음을 2n2^n개 읽는다. 이렇게 만든 원을 크기 nn에 대한 우로보로스 원(Ouroboros circle)이라 부른다. 각 nn에 대해 우리는 가장 작은 우로보로스 수만을 다룬다.

예를 들어 n=2n = 2일 때 우로보로스 수는 00110011, 01100110, 11001100, 10011001의 네 개뿐이며, 이 중 가장 작은 수는 00110011이다. 아래 그림은 00110011에 대한 우로보로스 원이다.

함수 o(n;k)o(n; k)는 크기 nn의 가장 작은 우로보로스 수로 만든 우로보로스 원에서 위치 kk부터 시작하는 묶음이 나타내는 값을 돌려준다. 위치는 00부터 세며, 위치 kk에서 시작해 원을 따라 연속한 nn개의 비트를 읽어 이진수로 해석한다(시작 위치 kk의 비트가 최상위 비트). 여러분의 프로그램은 이 함수 o(n;k)o(n; k)를 계산해야 한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 두 정수 nn과 kk가 주어지는 한 줄로 구성된다(1≤n≤151 \le n \le 15, 0≤k<2n0 \le k < 2^n). 입력의 끝은 두 개의 00이 적힌 줄로 표시되며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다 o(n;k)o(n; k)의 값을 한 줄에 하나씩 출력한다.

예제4

  1. 예제 1

    입력
    2 0
    2 1
    2 2
    2 3
    0 0
    
    예상 출력
    0
    1
    3
    2
    
  2. 예제 2

    입력
    1 0
    1 1
    0 0
    
    예상 출력
    0
    1
    
  3. 예제 3

    입력
    3 0
    3 1
    3 2
    3 3
    3 4
    3 5
    3 6
    3 7
    0 0
    
    예상 출력
    0
    1
    2
    5
    3
    7
    6
    4
    
  4. 예제 4

    입력
    4 0
    4 1
    4 2
    4 3
    4 4
    4 5
    4 6
    4 7
    4 8
    4 9
    4 10
    4 11
    4 12
    4 13
    4 14
    4 15
    0 0
    
    예상 출력
    0
    1
    2
    4
    9
    3
    6
    13
    10
    5
    11
    7
    15
    14
    12
    8