問題
提出コード
方針がたってから遷移をバグなく求めるまでになんと半日かかりました!
解法
桁DPです。
というのも、2進数になおした2つの数字のペアについて、それぞれの桁についてありうる桁の組み合わせは、
の3種類のみです。
そして、これらの組み合わせが、そのままの組み合わせになります。
については、
と
ではどちらも0になりますが、
のパターンは、
をしたときにくりあがりをするため、
とは値が必ず異なります。
ということで、の3種類の組み合わせを
のそれぞれの桁に当てはめていったときに、
が
を下回るものの個数を求めれば、答えになります(
はかならず
以下になるので、これ以降は
について考察をする必要はなくなります)。
ということで、の組み合わせの中で、
が最大となるのは、
のときになるので、
を2進数に直した場合の桁数だけ、3種類のビットの組み合わせを当てはめていきます。
とします。
:左から今
桁目を見ている、という情報です。
:
桁目でくりあがりが行われたかどうか、という情報です。真なら1、偽なら0です。
:今作成している
は、
となることが確定しているかどうか、という情報です。真なら1、偽なら0です。
初期状態は、
となります。これはそれぞれ、桁目で
を選んだパターン(
桁目の繰り上がりなし)、
桁目で
を選んだパターン(
桁目の繰り上がりなし)、
桁目で
を選んだパターン(
桁目の繰り上がりあり)、の3つのパターンに対応します。
ここからは、0-indexedで考えていきます。例えば、2進数で110という数字は、左から0桁目と1桁目が'1'、2桁目が'0'です。
遷移の個数がかなり多いです。
の
桁目が0か1か
の
桁目の組み合わせをどれにするか
桁目の時点で
がどうだったか
桁目の
がどうなるか
によって遷移が決まります。の
桁目が0か1か、についてまずは考えていきます。
の
桁目が'1'
の時点で、
が1ならば
でも
はそのままになります。
が0のとき、
の
桁目が'0'になるような計算をしたときに
は1に変化し、'1'になるような計算をした場合は
は0のままです。
の
桁目が'0'
の時点で、
が1ならば
でも
はそのままになります。
が0のとき、
の
桁目が'0'になるような計算をしたときに
は0のままですが、'1'になるような計算をした場合はそもそも
を超えてしまうので、遷移ができません。
ということで、の
桁目が'0'になるか'1'になるかで、遷移が変わってくることがわかります。あとは、その他の遷移にかかわってくる条件をまとめて場合分けし、
の
桁目がどうなるかを調べれば、遷移が確定します。
- 3つの遷移に関わる条件について考え、
の
桁目がどうなるかを調べる
として、場合分けをしていきます。
の
桁目
というように表記し、羅列していきます。は、そのようになる可能性がないことを示します。
です。あとは、これらとの
桁目による遷移の条件をもとに、ひたすら羅列をしていくことで、答えを求めることができます。