No.050 D

桁DPを使う.

まず, となるので, だけ考えればいい.

ともに 桁目まで見たときに となる組み合わせの数を とする.

このとき, 桁目における の組み合わせパターンは両方が か片方が か両方が かの3パターンである. 片方が のパターンはどちらが かは気にしなくてもいい. (というか気にしてしまうと をダブルカウントしてしまう. , ともにどちらが でも同じ値になるので片方だけカウントしなければならない)

しかし, この桁DPを使うと が最大 となるので, の計算量となってしまう.

そこで, を上位 桁目まで見たときに の上位 ビットと の上位 ビットの差が になる組み合わせの数とする. こうすると の場合はその次の桁でどうがんばっても からは脱出できないので, にまとめてしまっていい. (後述の表を見るとわかるかも)

上位 ビットの の差と ビット目の の組み合わせパターンで上位 ビットの の差を表にすると下のようになる.

の上から ビット目が である:

両方0 片方1 両方1
0 0 over over
1 2 1 0
2 2 2 2

よって, このときのDPの更新は以下の通りである.

の上から ビット目が である:

両方0 片方1 両方1
0 1 0 over
1 2 2 1
2 2 2 2

よって, このときのDPの更新は以下の通りである.

この桁DPなら計算量は である.