ABC050 D - Xor Sum
問題
提出コード
方針がたってから遷移をバグなく求めるまでになんと半日かかりました!
解法
桁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つの遷移に関わる条件について考え、の桁目がどうなるかを調べる
として、場合分けをしていきます。
の桁目
というように表記し、羅列していきます。は、そのようになる可能性がないことを示します。
です。あとは、これらとの桁目による遷移の条件をもとに、ひたすら羅列をしていくことで、答えを求めることができます。