#include <iostream>
#include <string>
#include <cstdint>
#include <limits>

std::string Radix62c(std::uint64_t N, std::string buff) {
  std::string const Char = "0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ";
  int const Radix = 62;
  return (N == 0) ? buff
                  : Radix62c(N / Radix, Char[N % Radix] + buff);
}

std::string Radix62b(std::uint64_t N) {
  std::string const Char = "0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ";
  int const Radix = 62;
  return (N == 0) ? ""
                  : Radix62b(N / Radix) + Char[N % Radix];
}

std::string Radix62a(std::uint64_t N) {
  std::string const Char = "0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ";
  std::string Ret;

  int const Radix = 62;
  while (N != 0){
    int Ch = N % Radix;
    N /= Radix; /* changed */
    Ret = Char[Ch] + Ret;
  }
  return Ret;
}

int main() {
  std::uint64_t N = std::numeric_limits<std::uint64_t>::max();
  std::cout << N << " == " << Radix62a(N) << std::endl;
  std::cout << N << " == " << Radix62b(N) << std::endl;
  std::cout << N << " == " << Radix62c(N, "") << std::endl;
  return 0;
}
/* end */
