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

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

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

i=1N1j=i+1N(AiAj)=ki=1N1j=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=#{iAi&zk=0},Ck=#{iAi&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)

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

の4通りなので、 i=1N1j=i+1N((Ai&zk)(Aj&zk))=BkCkzk\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