#include <iostream>
#include <vector>
#include <string>
#include <cstdint>
#include <algorithm>
typedef std::vector<std::uint64_t> DType;
static const std::uint64_t Radix = 'Z' - 'A';
DType DecToRadix(std::uint64_t N, std::uint64_t R){
DType D;
std::uint64_t V = 0;
bool Carry = false;
std::uint64_t T = 0;
if (N == 0)return{ 0, };
while (N != 0){
V = (N % R) +(N>=R? 1:0);
D.push_back(V);
Carry = false;
T = N - R;
if (T >=0 && T<=R) Carry = true;
N = (N - V) / R;
}
if (Carry) D.push_back(0);
for (std::size_t i = 0; i < D.size()-1; i++){
D[i] = (R + D[i]-1) % R;
}
std::reverse(D.begin(), D.end());
return D;
}
std::int64_t RadixToDec(DType D, std::uint64_t R){
std::uint64_t N = 0;
if (D.size() == 0) return 0;
for (std::size_t i = 0; i < D.size(); i++)
{
N *= R;
N += D[i]+1;
}
return N-1;
}
std::string DTypeToString(DType D){
std::string S;
if (D.size() == 0) return{ "error" };
for (std::size_t i = 0; i < D.size(); i++)
{
S += 'A' + static_cast<char>(D[i]);
}
return S;
}
DType StringToDType(std::string s){
DType D;
for (std::size_t i = 0; i < s.size(); i++){
D.push_back(s[i] - 'A');
}
return D;
}
std::string Enc(std::uint64_t N){
DType D;
std::string S;
D = DecToRadix(N, Radix+1);
S = DTypeToString(D);
return S;
}
std::uint64_t Dec(std::string s){
DType D;
D = StringToDType(s);
return RadixToDec(D, Radix+1);
}
int main(){
std::string S;
std::uint64_t N=0;
N = 1;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 27;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 28;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 703;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 2;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 125;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 2757;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 702;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
N = 18278;
S = Enc(N-1);
std::cout << N << " -> " << S << std::endl;
S = "A";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "AA";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "AAA";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "Z";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "ZZ";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "ZZZ";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
S = "DBA";
N = Dec(S);
std::cout << S << " -> " << N+1 << std::endl;
for (std::uint64_t i = 1; i < 2500000; i++){
S = Enc(i - 1);
N = Dec(S) + 1;
if (N != i) std::cout << "Test Missed:" << i << "!=" << N << " ->" << S << std::endl;
}
return 0;
}