問題概要
問題文はこちらを参照してください。
コンテスト後の解説放送中に話題に出たDPを使った解法を書きました。数値が$n$以下という制限がないのでいわゆる桁DPというよりは、「AtCoder Typical DP Contest Q 連結」の解説のような1文字ずつ増やしていくDPが近いのかなと思います。また、$n$番目の組み合わせを求めるというのは、「AtCoder Typical DP Contest G 辞書順」の解説に出てくるやり方です。
解法
まずは作問者の方の解説に書いてある条件をもとに、この問題を「"3"と"5"からなる長さ$1~L$の文字列のうち、1桁目が"5"であり、各桁の数字の和が3の倍数であるような文字列の組み合わせの中で、$n$番目の数を求めよ」と読みかえます。
$dp[i][j][k]$:$i$文字目(1桁目から数える)が$d[j]$という数のときにそれまでの各桁の数字の和を3で割った余りが$k$である文字列の組み合わせの数
$(0\le i \le 25,\ 0\le j,l \le 1,\ 0\le k \le 2)$
初期値:$dp[1][1][2]=1$(1文字目が"5"のとき、つまり3で割った余りが2のときのみ存在する)
求める解:$dp[i][j][0]$。$i$文字目が$d[j]$のときに各桁の数字の和を3で割った余りが0である組合せの数となる。
このように$i$文字目の状態から$l$のループを回して$i+1$文字目として"3"または"5"のときそれぞれの遷移を配るDPで行います。今回はサンプルより最大の文字列の長さが25とわかるので、$i=25$までのDPを求めておくことができます。
まずは$n$番目の数が何桁なのかを求めるために、$n$から$dp[i][j][0]$を小さいほうから順に引いていきます。そしてそれが0以下になるところ(小さいほうからの累積和が初めて$n$以上になるところ)が求める桁数になります。この結果は作問者の方の解説では数え上げによって求められていたものと同じです。
桁数と先頭の数がわかったら、その中で$n'$番目の数は何なのかを求めます。上記の例では結局、4文字目が"5"で長さが4の条件を満たす文字列(2つある)の中で1番目の組み合わせを求めることになります。これは4文字目から1文字目までどのような遷移をたどってきたかを戻りながら求める$n'$番目の数を決定していきます。遷移を戻っていくためには決定した数字によって3で割った余りが変化していくところを考えていく必要があります。
考察
この解説ではわかりやすいかと思って$i$文字目が$d[j]$("3"または"5")のときの組み合わせの数という状態を作りました。ちなみにuwiさんの回答では$j$に関する状態は作られていません($dp[i][k]$:$i$文字目までで各桁の数字の和を3で割った余りが$k$の組み合わせの数)。その代り$i$文字目がどちらなのかを決定する際にDPの$i-1$の値を使って決定されています。この解説では$i$文字目を決定するためにDPの$i$の値を使っています。結局やっていることは一緒だと思います。