https://atcoder.jp/contests/abc147/tasks/abc147_d
もちろん素朴に計算していては間に合わないが、ビット毎に考えれば良い。
zi=1≪i とおくと、任意の x に対して x=∑ix&zi であり、
(x⊕y)&zi=(x&zi)⊕(y&zi) である。
∑i=1N−1∑j=i+1N(Ai⊕Aj)=∑k∑i=1N−1∑j=i+1N((Ai&zk)⊕(Aj&zk))
であり、右のように変形すると、Ai&zk=0 または zk であるので計算が簡単にできる。
Bk=#{i∣Ai&zk=0},Ck=#{i∣Ai&zk=zk} とおくと、
(Ai&zk)⊕(Aj&zk) は
- 0⊕0=0
- 0⊕zk=zk
- zk⊕0=zk
- zk⊕zk=0
の4通りなので、
∑i=1N−1∑j=i+1N((Ai&zk)⊕(Aj&zk))=Bk∗Ck∗zk である。
あとはこれを k について足し合わせる。
https://atcoder.jp/contests/abc147/submissions/32456970