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なら計算量は である.