O(N2) 解は非常に高速ですが、実行時間制限に間に合わせるのは非常に難しいと思われます。より高速な解法を考えます。
まず、 xor演算はbitごとに独立です。よって、01列 A,B について、各操作回数 k(0≤k≤N−1) に対する式の値を求めることが出来れば、その答えに適切に係数を掛けたものを足し合わせることにより元の問題を解くことが出来ます。
以下、A,B は 01 列であり、0-indexedであるとします。
畳み込みを用いてこの問題を解くことを考えます。
多項式 f(x),g(x) をそれぞれ以下のように定義します。
- f(x)=a0+a1x+…+a2N−1x2N−1 (Ai mod N=1 ならば ai=1、Ai mod N=0 ならば ai=−1)
- g(x)=b0+b1x+…+bN−1xN−1 (BN−1−i=1 ならば bi=−1、BN−1−i=0 ならば bi=1)
f,g の畳み込みの結果を h(x) とし、 h の xk の係数を Ck とすると、N−(N−C2N−1−k)/2 は k 回操作を行ったときの式の値となります。
よって、各bitについてこの計算を行うことにより、 O(NlogNlogAmax) で元の問題を解くことが出来ました。(Amaxは Ai,Bi の最大値)