#G4006. [GESP202309 四级] 变长编码

[GESP202309 四级] 变长编码

题目描述

小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。

但他发现,生活中常用的较小整数也需要使用固定字节数存储,可能会造成空间浪费。于是,他了解了一种针对非负整数的变长编码方式。

编码规则如下:

  1. 将给定的非负整数转换为二进制形式。

    例如:

    ((0)_{10}=(0)_2)

    ((926)_{10}=(1110011110)_2)

  2. 将二进制数从低位到高位,每 77 bit 分为一组。

    如果最高的一组不足 77 bit,则在高位补 00

    例如:

    • 00 分为一组:0000000
    • 926926 分为两组:00111100000111
  3. 从表示低位的组开始,为每组增加一个最高位,使每组变为 88 bit:

    • 如果当前组不是最后一组,则最高位填 1
    • 如果当前组是最后一组,则最高位填 0

因此:

  • 00 的变长编码为 00000000,即十六进制 00
  • 926926 的变长编码为 1001111000000111,即十六进制 9E 07

例如,987654321012345678987654321012345678 的变长编码为:

CE 96 C8 A6 F4 CB B6 DA 0D

99 个字节。

请编写程序,求出给定非负整数的变长编码。

输入格式

输入一行,包含一个非负整数 NN

输出格式

输出一行,表示 NN 对应的变长编码。

每个字节均使用两位十六进制表示,其中 AF 使用大写字母。

相邻两个字节之间用一个空格分隔。

样例

0
00
926
9E 07
987654321012345678
CE 96 C8 A6 F4 CB B6 DA 0D

数据范围

0N10180 \le N \le 10^{18}