合成できるときはすぐ合成する
レベル の物品の重みを とする。合成は各種類の総重量を保ち、一枠を空ける。合成を尽くすと、レベル 未満では各レベルに高々一個だけ残る。この正規形は二進数の繰り上がりで一意に定まり、同じ総重量を表す状態の中で使用枠数が最少となる。
生成される種類の列を固定する。ある戦略がその列に従って生成を続けられるなら、正規化する戦略も空き枠が少なくならないため続けられる。星の総重量が に達すれば、合成してレベル の星を作れる。したがって、どの生成結果の列に対しても即座の合成は不利にならない。毎回合成を尽くし、空き枠があれば生成すればよい。
状態と遷移
、 とする。成功前の星は のマスク、レベル 未満の月は のマスクで表せる。レベル の月は一枠を永久に使う。
そのような月を除いた残りの枠数を とし、状態からの成功確率を とする。 なら生成できず、値は零である。 の層も零とする。
星の生成は に一を加えることで、すべての二進の繰り上がりをまとめて処理できる。 に達したら即成功する。月の生成は に一を加え、 に達したら として を一減らす。
、 とすると
答えは である。最後の空き枠を使う場合でも、目標の星ができたら成功とする。最高レベルの月は捨てられないので、必ず容量を減らす。
の昇順、同じ層では の降順に計算する。現在と一つ前の層だけ保持すればよい。時間計算量は 、空間計算量は で、全体の制約では最大 状態を計算する。
サブタスク
サブタスク 1 は各種類・各レベルの実際の個数を保存するメモ化探索で解ける。合成できれば合成し、できず空きがあるときだけ生成の二通りに分岐する。個数ベクトルは高々 個で、このサブタスクでは最大 個となる。付属の naive はこの方法である。
サブタスク 2 は なので、一度でも星が出れば成功する。月だけが出続けた場合、初めて生成できなくなるまでの回数は
である。答えは で、逆元も含めて 時間で計算できる。
として 、 を使う。生成のたびに総重量が一増え、その上限は なので生成回数は有限である。既約分母は の累乗の約数で、 より逆元が存在する。
二つの確率の積の和は 未満なので符号付き ビット整数で十分であり、既約分数をそのまま構成する必要はない。独立な forward 解法は星と月の総重量順に確率を伝播する。小さい場合は正確な有理数で全合成・生成の選択も比較した。
Solution written by GPT