solution

$26$で再帰的にdivmodしていく。 $1$-basedで考えて$0$番目の文字列は空文字列 、$N+1$番目の文字列は$\lfloor N / 26 \rfloor$番目の文字列の後ろに$N \bmod 26$番目の文字を加えたもの。

最初に$N$に$1$を足すのが肝。 自然な対応ではAに対応する自然数は$1$であり、$0$に対応するのは空文字列 である。

似た話として、自然数の$10$進数表記がある。10は$2$桁の自然数であり1は$1$桁の自然数であるが、0は$0$桁あるいは$- \infty$桁の自然数というのが自然であり、例外処理をされない本来の表記は0ではなく空文字列 と考えるのが妥当だ、というのがある。

implementation

#!/usr/bin/env python3
import string
n = int(input()) + 1
s = ''
while n:
    n -= 1
    s += string.ascii_uppercase[n % 26]
    n //= 26
s = ''.join(reversed(s))
print(s)