Вступ
Код Еліаса може бути використаний для ефективного кодування додатних цілих чисел, коли немає попередньої інформації про величину чисел, які потрібно закодувати, і відомо, що ймовірність отримання великого числа менша або дорівнює ймовірності отримання малого числа. З практичних міркувань, однак, у цьому конкурсі ми встановлюємо обмеження на розмір вхідних цілих чисел. З тієї ж причини ми обмежуємо вхідне ціле число бути більшим за 1.
Еліас розробив три варіанти коду: методи кодування Еліаса гамма, Еліаса дельта та Еліаса омега. Ця задача представляє методи Еліаса гамма та Еліаса омега і вимагає реалізації коду Еліаса омега. Нижче наведено передумови, визначення та ілюстрацію задачі.
Передумови
Припустимо, що Аліса хоче передати додатне ціле число Бобу через двійковий канал, і нехай позначає двійкове представлення . Якщо Боб знає (кількість бітів, необхідних для двійкового представлення ) заздалегідь, тоді Аліса повинна використовувати для передачі. З іншого боку, якщо Боб не має цієї інформації, тоді Аліса може спочатку надіслати , використовуючи ефективне та розрізнювальне кодування, а потім вона може надіслати фактичний бета-код F_1 = \beta(n). Кінцевий результат - це код з двома полями \langle F_1, F_2 \rangle.
Код Еліаса та його варіанти відрізняються способом кодування цих двох частин інформації (F_1 та F_2). Основна відмінність між варіантами полягає в представленні F_1. Це може означати модифікації в представленні F_1. Крім того, деякі з варіантів застосовують повторення або рекурсію до представлення F_1. Ми використовуємо конкретний варіант, зазначений нижче.
Визначення
Формально, у кодуванні Еліаса гамма, додатне ціле число кодується за допомогою двох конкатенованих бітових полів. Перше поле, префікс, містить \lfloor\log_2 n\rfloor бітів ( - це нижня межа ). Друге поле, постфікс, - це фактичне двійкове представлення , використовуючи \lfloor\log_2 n\rfloor+1 бітів. Наприклад, двійкове представлення десяткового числа - це . За кодуванням Еліаса кодується як . Перші три провідні нулі позначають, що для двійкового представлення потрібно чотири біти. Наступні чотири біти містять двійкове представлення . Код Еліаса дельта застосовує гамма-код до префікса (\lfloor\log_2 n\rfloor) гамма-коду, а код Еліаса омега застосовує рекурсію над префіксом гамма-представлення Еліаса \lfloor\log_2 n\rfloor.
Ілюстрація (детальний приклад)
Щоб далі проілюструвати код Еліаса омега, розглянемо ціле число . Двійкове представлення цього числа - це 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011, що вимагає бітів. Отже, на першому кроці воно кодується наступним чином:
\langle F_1, F_2 \rangle = \langle 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000, 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011\rangle
де пробіли, крапки, коми та дужки вставлені для зручності читання.
Щоб підкреслити, для цього конкурсу рекурсія зупиняється, коли перше поле рекурсивного етапу містить один 0.
Розглядаючи всі біти, згенеровані всіма кроками, і використовуючи для позначення двійкового представлення , ми маємо:
a. \langle 28\ \text{нулів}, \beta(536870907)\rangle = \langle 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000, 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011\rangle
b. \langle \langle 4\ \text{нулі}, \beta(28)\rangle, \beta(536870907) \rangle = \langle \langle 0000, 1\ 1100\rangle, 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011\rangle
c. \langle\langle\langle 2\ \text{нулі}, \beta(4)\rangle, \beta(28)\rangle, \beta(536870907) \rangle = \langle \langle\langle 00, 100\rangle, 1\ 1100\rangle, 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011\rangle
d. \langle\langle\langle\langle 0, 10\rangle, \beta(4)\rangle, \beta(28)\rangle, \beta(536870907) \rangle = \langle \langle\langle\langle 0, 10\rangle, 100\rangle, 1\ 1100\rangle, 1\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1011\rangle
Відкидаючи всі пробіли, крапки, коми та дужки, ми отримуємо, що код Еліаса омега для є: . Цей код розрізнювальний (унікально декодований). Його можна декодувати унікальним чином і отримати назад число .
Умова задачі
Дано деякі додатні цілі числа в діапазоні від до 2 \times 10^9, вам потрібно написати програму для отримання кодів Еліаса омега для цих чисел.
Вхід містить додатні цілі числа, кожне в окремому рядку. Кожне число знаходиться в межах від до , включно. Кінець вводу позначається нулем. Вхід може містити до ста рядків.
Вихід складається з рядків, кожен з яких відповідає вхідному цілому числу, крім останнього нуля. Кожен рядок містить код Еліаса омега для кожного вхідного цілого числа. Вихід не повинен містити жодних пробілів або порожніх рядків.
Приклад 1