はまやんはまやんはまやん

hamayanhamayan's blog

One Quadrillion and One Dalmatians [AtCoder Beginner Contest 171 C]

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;
}