AtCoder Regular Contest 066 D - Xor Sum
今更書くまでもない超有名問題だけどかなり手こずったのでメモ。基本的に系は和ととても相性が悪い。
問題の性質を考えると、 を満たすとき、常に であるため、 だけ考えればよい。また、足し算の有名な言い換えがあります。これはつまり、とのbitごとの交換に関して不変です。つまり、との各bitはの3通りだけ考えれば良いです。
を上からi ビット目まで見たときに、だけより小さい場合の組み合わせ数と定義します。このとき、が2以上の場合は、i+1ビット目について、 となるため、例え今見ているビットがで、のビットがだったとしても以上より小さいことは確定します。そのため、は状態としての3通りだけ見るdpを考えればよいです。
なぜこんなdpが思いつくかというと、足し算の繰り上がりによりNを超えるギリギリの線を覚えておく、みたいな感覚になります。ここがちょっと難しいですが繰り上がり系のdpが出てきたときにはこの感覚を覚えておきたいです。
dpの遷移としては、をNのiビット目(0または1)と定義すると、 などとなります。
計算量は