https://atcoder.jp/contests/abc147/tasks/abc147_d

もちろん素朴に計算していては間に合わないが、ビット毎に考えれば良い。

zi=1≪iz_i = 1 \ll i とおくと、任意の xx に対して x=∑ix&zix = \sum_i x \& z_i であり、 (x⊕y)&zi=(x&zi)⊕(y&zi)(x \oplus y) \& z_i = (x \& z_i )\oplus (y \& z_i) である。

∑i=1N−1∑j=i+1N(Ai⊕Aj)=∑k∑i=1N−1∑j=i+1N((Ai&zk)⊕(Aj&zk))\sum_{i=1}^{N-1} \sum_{j=i+1}^N (A_i \oplus A_j) = \sum_k \sum_{i=1}^{N-1} \sum_{j=i+1}^N ((A_i \& z_k) \oplus (A_j \& z_k)) であり、右のように変形すると、Ai&zk=0A_i \& z_k = 0 または zkz_k であるので計算が簡単にできる。

Bk=#{i∣Ai&zk=0},Ck=#{i∣Ai&zk=zk}B_k = \#\{ i \mid A_i \& z_k = 0 \}, C_k = \#\{ i \mid A_i \& z_k = z_k \} とおくと、 (Ai&zk)⊕(Aj&zk)(A_i \& z_k) \oplus (A_j \& z_k) は

  • 0⊕0=00 \oplus 0 = 0
  • 0⊕zk=zk0 \oplus z_k = z_k
  • zk⊕0=zkz_k \oplus 0 = z_k
  • zk⊕zk=0z_k \oplus z_k = 0

の4通りなので、 ∑i=1N−1∑j=i+1N((Ai&zk)⊕(Aj&zk))=Bk∗Ck∗zk\sum_{i=1}^{N-1} \sum_{j=i+1}^N ((A_i \& z_k) \oplus (A_j \& z_k)) = B_k * C_k * z_k である。 あとはこれを kk について足し合わせる。

https://atcoder.jp/contests/abc147/submissions/32456970