이진 문자열 나열

길이 N인 2^N개의 이진 문자열을 i XOR floor(i/2) 공식으로 주어지는 이진 반사 그레이 코드 순서로 출력한다.

쉬움3비트 연산수학구현아직 제출이 없습니다시간 제한1초메모리 제한64 MB

문제

니콜라가 수학 시간에 질문을 끝없이 던지자, 선생님은 반 전체에 다음 과제를 냈다.

길이가 NN인 이진 문자열은 모두 2N2^N개다. 이 2N2^N개를 한 줄에 하나씩, 각 문자열이 정확히 한 번씩만 나오도록 나열한다. 이때 이웃한 두 줄의 거리가 항상 1이어야 한다.

두 이진 문자열의 거리는 같은 위치의 값이 서로 다른 자리의 개수다. 예를 들면 다음과 같다.

  • 거리(111, 000) = 3 (첫째, 둘째, 셋째 자리가 다르다)
  • 거리(111100, 101010) = 3 (둘째, 넷째, 다섯째 자리가 다르다)
  • 거리(110011, 110011) = 0

조건을 만족하는 나열은 여러 가지다. 이 문제에서는 그중 하나만 정답으로 인정한다. 줄 번호를 0부터 세어, ii번째 줄에는 ii/2i \oplus \lfloor i/2 \rfloorNN자리 이진수로 쓴다. 여기서 \oplus는 비트 단위 배타적 논리합이고, 자리가 모자라면 앞을 '0'으로 채운다. 이 나열이 반사 이진 그레이 코드이며, 이웃한 두 줄은 정확히 한 자리에서만 다르다.

입력

첫째 줄에 이진 문자열의 길이 NN이 주어진다. (1N161 \le N \le 16)

출력

2N2^N개의 줄을 출력한다. ii번째 줄 (0i<2N0 \le i < 2^N)에는 ii/2i \oplus \lfloor i/2 \rfloorNN자리 이진 표현을 출력한다. 각 줄은 '0'과 '1'로만 이루어진 정확히 NN자리여야 한다.

해가 적어도 하나는 항상 존재한다고 가정할 수 있다.