https://atcoder.jp/contests/abc171/tasks/abc171_c
解説
https://atcoder.jp/contests/abc171/submissions/14611823
難しい問題に見えるだろう。
こういう問題を見ると、~進数で見るような癖がついてしまっているので、そういう目線でどうしても見てしまう。
今まで関連問題を解いたことがないのに、思いつくのはなかなかだ。
26進数で考えるのだが、ちょっと考えにくいので、自然に考えることができる9進数で考えてみる。
1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,...
これを見てみると、0が使えない分ちょっとおかしい感じになっている。
縦並びで見てみる。
1 2 3 4 5 6 7 8 9
11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
...
9周期なのに先頭が1なのは扱いにくいので、1引く
0 1 2 3 4 5 6 7 8
10 11 12 13 14 15 16 17 18
20 21 22 23 24 25 26 27 28
いい感じ、mod 9に+1すれば最終桁が出てくる。
~進数ではここから割るので、9で割る。
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
...
9 9 9 9 9 9 9 9 9
1111 11 11 11 11 11 11 11
いい感じ。
ここで0ならもう終わりだし、そうじゃないなら、また、1,2,3,...,9,11,12,...の列になっているので再帰的に同じことを行う。
つまりは1引いて9で割った余りを取って、9で割るを繰り返せばいい。
問題は26進数なので、26でそれをやろう。
ll N; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; string ans = ""; while (0 < N) { N--; int m = N % 26; ans = char('a' + m) + ans; N /= 26; } cout << ans << endl; }