問題
https://atcoder.jp/contests/abc161/tasks/abc161_d
方針
- ルンルン数を、1番目から順に作成していきK番目のルンルン数を作成する
ポイント
- 1桁の自然数(
1~9
)は全てルンルン数である。 - あるルンルン数
X
が与えられた時、文字列X
の末尾に特定の文字を書き足すことで新たなルンルン数Y
を作成することができる。- 書き足す文字の候補は、
X
の末尾の文字をs
としてs-1, s, s+1
である。- s=0の場合:
s, s+1
- s=9の場合:
s-1, s
- それ以外の場合:
s-1, s, s+1
- s=0の場合:
- この時、明らかに
X < Y
である - 逆に、
n>2
として、あるn
桁のルンルン数Y
がある時、Y
の先頭からn-1
桁をスライスした数X
もまたルンルン数である。Y
に対してX
はただ一つのみ存在する
- 書き足す文字の候補は、
アルゴリズム
上記の性質を使うと、
1~9
が格納されたキューを用意する- デキューする。その数から新たなルンルン数を2または3個作成、エンキューする。このステップを繰り返す。
ことで、K番目のルンルン数を得ることができる。
コード
1 | import queue |
記事情報
- 投稿日:2020年4月5日
- 最終更新日:2020年4月5日