엘리아스 오메가 부호화
시간 제한1초메모리 제한128 MB
0이 나올 때까지 각 양의 정수에 대해 비트 길이의 코드를 재귀적으로 앞에 붙여 엘리어스 오메가 코드를 출력한다.
문제
엘리아스(Elias) 부호는 부호화할 양의 정수의 크기에 대한 사전 정보가 없고, 작은 정수가 나올 확률이 큰 정수가 나올 확률보다 크거나 같다고 가정할 때 정수를 효율적으로 부호화하는 접두 부호이다. 이 문제에서는 정수의 크기에 상한을 두며, 부호화할 모든 정수는 보다 크다.
엘리아스는 세 가지 변형인 엘리아스 감마(gamma), 델타(delta), 오메가(omega) 부호를 정의했다. 이 문제에서는 감마 부호와 오메가 부호를 소개하고, 엘리아스 오메가 부호를 구현하도록 요구한다.
양의 정수 의 이진 표현을 이라 하자(가장 앞 비트는 항상 이다). 그리고 그 비트 수를 이라 하자. 수신자가 을 미리 안다면 송신자는 만 보내면 된다. 모른다면 먼저 그 길이를 스스로 구분 가능한(self-delimiting) 방식으로 보내야 하며, 각 변형은 이 길이를 부호화하는 방법에서 차이가 난다.
엘리아스 감마. 양의 정수 은 이어 붙인 두 필드로 표현된다. 앞부분(prefix)은 개의 비트이고, 뒷부분은 개의 비트를 차지하는 이다. 예를 들어 이므로 의 감마 부호는 이다. 앞의 세 개는 뒤에 네 비트가 온다는 뜻이고, 그 네 비트가 이다.
엘리아스 오메가. 오메가 부호는 앞부분에 을 나열하는 대신 그 길이를 재귀적으로 부호화한다. 로 두면, 오메가 부호는 다음과 같이 정의된다.
즉, 어떤 단계의 앞부분에 필요한 이 하나뿐이 되는 순간 재귀가 멈춘다.
예를 들어 을 살펴보자. 그 이진 표현 은 비트가 필요하다. 단계별로 부호를 만들면(, , ):
모두 이어 붙이면 엘리아스 오메가 부호
를 얻으며, 이는 유일하게 복호화되어 로 되돌아간다.
여러 개의 양의 정수가 주어질 때, 각 정수의 엘리아스 오메가 부호를 출력하여라.
입력
각 줄에는 을 만족하는 양의 정수 이 하나씩 주어진다. 이 적힌 줄은 입력의 끝을 나타내며 부호화하지 않는다. 종료용 앞에 오는 정수는 최대 개이다.
출력
입력의 각 정수에 대해(종료용 은 제외) 그 엘리아스 오메가 부호를 입력 순서대로 한 줄에 하나씩 출력한다. 출력에는 공백이나 빈 줄이 없어야 한다.