Editorial

5文字しか使わないのでパッと5進法展開が思い浮かぶと思います。

0を"a", 1を"i", 2を"u", 3を"e", 4を"o"とするとうまくいきそうですが、K>4K > 4のケースで落ちます。

具体的には辞書順で5番目の文字列は「aa」となるのですが、5を5進法展開すると1010になり、1は"i"であるので「ia」となってしまいます。

一方で実は、文字列長が事前にわかっていれば上の解放を使うことができます。

ABC029 - C : Brute-force Attack

この問題の想定解は再帰関数で文字列を構築することらしいですが、別に3進展開でも解くことができます。 これを利用します。

つまり現在の方針としては、KK番目の文字列はnn文字で構成される文字列の中で何番目であるかを求めたいことになります。

これは文字列の長さをnn, nn文字の文字列の辞書順で何番目であるかをKnK_nと置くと以下のように計算できます。

Kn=K(n1文字までの文字列の総数)=Ki=1n15iK_n = K - (n-1文字までの文字列の総数) = K - \sum_{i = 1}^{n-1}{5^i}

先程のK=5K = 5の「ia」ですが、これはn1n-1文字の文字列の考慮をせずに5進法展開をしているのでズレてしまったわけです。

1文字で構成される文字列は全てで5文字あるので、Kn=55=0K_n = 5 - 5 = 0となり、KK番目の文字列は2文字の文字列で一番はじめに登場する文字列であることがこれでわかります。 あとは、KnK_nを普通に5進法展開をすればそれが答えです。

ただし、注意点としてK<5K < 5。つまり、文字列長が1文字であるときは上のKnK_nの式が成り立たないのでそこだけ適切に場合分けしてあげることが必要です。 (n-1文字までの文字列の総数を計算するときに5n5^nが登場しますが、5n1=15^{n-1}=1なので、無駄にKKから1引かれてしまって答えがズレます。)

再帰関数を使っても解けるような気がしますが再帰の深さを考えるとやめておいたほうがいいと思います。

回答例(C++)