#include <iostream>
using namespace std;
uint64_t CompressAmount(uint64_t n)
{
if (n == 0)
return 0;
int e = 0;
while (((n % 10) == 0) && e < 9) {
n /= 10;
e++;
}
if (e < 9) {
int d = (n % 10);
//assert(d >= 1 && d <= 9);
n /= 10;
return 1 + (n*9 + d - 1)*10 + e;
} else {
return 1 + (n - 1)*10 + 9;
}
}
uint64_t DecompressAmount(uint64_t x)
{
// x = 0 OR x = 1+10*(9*n + d - 1) + e OR x = 1+10*(n - 1) + 9
if (x == 0)
return 0;
x--;
// x = 10*(9*n + d - 1) + e
int e = x % 10;
x /= 10;
uint64_t n = 0;
if (e < 9) {
// x = 9*n + d - 1
int d = (x % 9) + 1;
x /= 9;
// x = n
n = x*10 + d;
} else {
n = x+1;
}
while (e) {
n *= 10;
e--;
}
return n;
}
int main() {
int64_t COIN = 100000000;
int64_t MAX_MONEY = 21000000 * COIN;
uint64_t input = MAX_MONEY + 1;
uint64_t result = CompressAmount(input);
uint64_t result2 = DecompressAmount(result);
std::cout << "Input : " << input << "\n";
std::cout << "Encoded: " << result << "\n";
std::cout << "Decoded: " << result2 << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnVpbnQ2NF90IENvbXByZXNzQW1vdW50KHVpbnQ2NF90IG4pCnsKICAgIGlmIChuID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBpbnQgZSA9IDA7CiAgICB3aGlsZSAoKChuICUgMTApID09IDApICYmIGUgPCA5KSB7CiAgICAgICAgbiAvPSAxMDsKICAgICAgICBlKys7CiAgICB9CiAgICBpZiAoZSA8IDkpIHsKICAgICAgICBpbnQgZCA9IChuICUgMTApOwogICAgICAgIC8vYXNzZXJ0KGQgPj0gMSAmJiBkIDw9IDkpOwogICAgICAgIG4gLz0gMTA7CiAgICAgICAgcmV0dXJuIDEgKyAobio5ICsgZCAtIDEpKjEwICsgZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDEgKyAobiAtIDEpKjEwICsgOTsKICAgIH0KfQoKdWludDY0X3QgRGVjb21wcmVzc0Ftb3VudCh1aW50NjRfdCB4KQp7CiAgICAvLyB4ID0gMCAgT1IgIHggPSAxKzEwKig5Km4gKyBkIC0gMSkgKyBlICBPUiAgeCA9IDErMTAqKG4gLSAxKSArIDkKICAgIGlmICh4ID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICB4LS07CiAgICAvLyB4ID0gMTAqKDkqbiArIGQgLSAxKSArIGUKICAgIGludCBlID0geCAlIDEwOwogICAgeCAvPSAxMDsKICAgIHVpbnQ2NF90IG4gPSAwOwogICAgaWYgKGUgPCA5KSB7CiAgICAgICAgLy8geCA9IDkqbiArIGQgLSAxCiAgICAgICAgaW50IGQgPSAoeCAlIDkpICsgMTsKICAgICAgICB4IC89IDk7CiAgICAgICAgLy8geCA9IG4KICAgICAgICBuID0geCoxMCArIGQ7CiAgICB9IGVsc2UgewogICAgICAgIG4gPSB4KzE7CiAgICB9CiAgICB3aGlsZSAoZSkgewogICAgICAgIG4gKj0gMTA7CiAgICAgICAgZS0tOwogICAgfQogICAgcmV0dXJuIG47Cn0KCmludCBtYWluKCkgewoJaW50NjRfdCBDT0lOID0gMTAwMDAwMDAwOwoJaW50NjRfdCBNQVhfTU9ORVkgPSAyMTAwMDAwMCAqIENPSU47CgkKCXVpbnQ2NF90IGlucHV0ID0gTUFYX01PTkVZICsgMTsKCXVpbnQ2NF90IHJlc3VsdCA9IENvbXByZXNzQW1vdW50KGlucHV0KTsKCXVpbnQ2NF90IHJlc3VsdDIgPSBEZWNvbXByZXNzQW1vdW50KHJlc3VsdCk7CgkKCXN0ZDo6Y291dCA8PCAiSW5wdXQgIDogIiA8PCBpbnB1dCA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8ICJFbmNvZGVkOiAiIDw8IHJlc3VsdCA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8ICJEZWNvZGVkOiAiIDw8IHJlc3VsdDIgPDwgIlxuIjsKCXJldHVybiAwOwp9Cg==