AtCoder Regular Contest 099 / AtCoder Beginner Contest 101 - D : Snuke Numbers
いろんな人が で解いているので
で解けるんじゃない?という主張をします。(実際早くはなりません(元々がかなり早いので...))
そして当然constexprが乗ります!コンパイル時 で実行時は出力するだけです
arc099.contest.atcoder.jp
実際明快でわかりやすいC++の形です(第1144項目のすぬけ数で
を超えるみたいです?)
本題
すぬけ数について、まずすぬけ関数 を定義してみます。
とするのが自然で、この関数の極小値について考えていきます。
について、
か
が成り立ち、
のとき必ず
です。
のときは、
を変形すると
となってこれは
です。
次に、 が成り立つ
のみに定義域を絞ったときの
の極小値について考えます。
定義域は なので、
について考えます。
すると、同様に考えて のときとそうでないときに分けられます。
以下 、
…と考えていくことができます。
ここで🎄気🎄になるのが、この論理の桁が上がっていくステップの中で、すぬけ数はどこで 側を満たすようになるのかということです。
よく考えると を満たすようになるところはすぬけ数のindexについて単調増加です。
つまり、あるところで が極小値でなくなったらこれから先は
の形の極小値しか存在しないということです。
これを利用すると、「次の 型の極小値候補が極小でない」ときに「次の桁まで9を詰める」ことを決意すればいいことがわかります。
計算量ですが、次の 型が極小でないときだけ一回余分に計算しているので、(何も考えずに評価していますけど)たぶん(
な)定数倍だけ余分な計算をしていると思います。
なのでたぶんこの答えは です。
おわりです