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

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

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

$\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))$ であり、右のように変形すると、$A_i \& z_k = 0$ または $z_k$ であるので計算が簡単にできる。

$B_k = \#\{ i \mid A_i \& z_k = 0 \}, C_k = \#\{ i \mid A_i \& z_k = z_k \}$ とおくと、 $(A_i \& z_k) \oplus (A_j \& z_k)$ は

  • $0 \oplus 0 = 0$
  • $0 \oplus z_k = z_k$
  • $z_k \oplus 0 = z_k$
  • $z_k \oplus z_k = 0$

の4通りなので、 $\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$ である。 あとはこれを $k$ について足し合わせる。

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