#include <algorithm>
#include <iostream>
#include <string>
#include <stdexcept>
class N62
{
public:
explicit N62(const std::string& digits) : N62(digits.c_str(), digits.size()) {}
N62(const char* digits, std::size_t len) : value(0u)
{
for (std::size_t i = 0; i != len; ++i) {
auto pos = std::find(std::begin(base), std::end(base), digits[i]);
if (pos == std::end(base)) {
throw std::runtime_error("bad format");
}
value *= base_size;
value += pos - std::begin(base);
}
}
N62(std::size_t value) : value(value) {}
operator std::size_t () const { return value; }
std::string str() const
{
if (value == 0u) {
return "0";
}
std::string res;
for (std::size_t n = value; n != 0; n /= base_size) {
res.push_back(base[n % base_size]);
}
std::reverse(res.begin(), res.end());
return res;
}
private:
std::size_t value;
private:
static constexpr char base[] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
static constexpr std::size_t base_size = 62;
};
std::ostream& operator << (std::ostream& os, const N62& n)
{
return os << n.str() << "(" << std::size_t(n) << ")";
}
constexpr char N62::base[];
N62 operator "" _n62 (const char *t, std::size_t len)
{
return N62(t, len);
}
int main()
{
N62 a = "42"_n62;
N62 b = 42;
std::cout << a << "*" << b << " = " << N62(a * b) << std::endl;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKY2xhc3MgTjYyCnsKcHVibGljOgogICAgZXhwbGljaXQgTjYyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaWdpdHMpIDogTjYyKGRpZ2l0cy5jX3N0cigpLCBkaWdpdHMuc2l6ZSgpKSB7fQogICAgTjYyKGNvbnN0IGNoYXIqIGRpZ2l0cywgc3RkOjpzaXplX3QgbGVuKSA6IHZhbHVlKDB1KQogICAgewogICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gbGVuOyArK2kpIHsKICAgICAgICAgICAgYXV0byBwb3MgPSBzdGQ6OmZpbmQoc3RkOjpiZWdpbihiYXNlKSwgc3RkOjplbmQoYmFzZSksIGRpZ2l0c1tpXSk7CiAgICAgICAgICAgIGlmIChwb3MgPT0gc3RkOjplbmQoYmFzZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiYmFkIGZvcm1hdCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhbHVlICo9IGJhc2Vfc2l6ZTsKICAgICAgICAgICAgdmFsdWUgKz0gcG9zIC0gc3RkOjpiZWdpbihiYXNlKTsKICAgICAgICB9CiAgICB9CiAgICBONjIoc3RkOjpzaXplX3QgdmFsdWUpIDogdmFsdWUodmFsdWUpIHt9CiAgICBvcGVyYXRvciBzdGQ6OnNpemVfdCAoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQogICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKICAgIHsKICAgICAgICBpZiAodmFsdWUgPT0gMHUpIHsKICAgICAgICAgICAgcmV0dXJuICIwIjsKICAgICAgICB9CiAgICAgICAgc3RkOjpzdHJpbmcgcmVzOwogICAgICAgIGZvciAoc3RkOjpzaXplX3QgbiA9IHZhbHVlOyBuICE9IDA7IG4gLz0gYmFzZV9zaXplKSB7CiAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soYmFzZVtuICUgYmFzZV9zaXplXSk7CiAgICAgICAgfQogICAgICAgIHN0ZDo6cmV2ZXJzZShyZXMuYmVnaW4oKSwgcmVzLmVuZCgpKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKcHJpdmF0ZToKICAgIHN0ZDo6c2l6ZV90IHZhbHVlOwpwcml2YXRlOgogICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGJhc2VbXSA9CiAgICAgICAgIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpzaXplX3QgYmFzZV9zaXplID0gNjI7Cn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBONjImIG4pCnsKICAgIHJldHVybiBvcyA8PCBuLnN0cigpIDw8ICIoIiA8PCBzdGQ6OnNpemVfdChuKSA8PCAiKSI7Cn0KCmNvbnN0ZXhwciBjaGFyIE42Mjo6YmFzZVtdOwoKTjYyIG9wZXJhdG9yICIiIF9uNjIgKGNvbnN0IGNoYXIgKnQsIHN0ZDo6c2l6ZV90IGxlbikKewogICAgcmV0dXJuIE42Mih0LCBsZW4pOwp9CgppbnQgbWFpbigpCnsKICAgIE42MiBhID0gIjQyIl9uNjI7CiAgICBONjIgYiA9IDQyOwoKICAgIHN0ZDo6Y291dCA8PCBhIDw8ICIqIiA8PCBiIDw8ICIgPSAiIDw8IE42MihhICogYikgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9Cg==