数列の任意の2つの項のXORの結果の合計を計算する方法

とある長さ Nの数列 A_1, A_2, \dots , A_Nに対し、 1\leq i\leq j\leq Nを満たす全ての組 (i,j)について A_i XOR  A_jをもとめ、その合計を計算する問題の解き方。

 詳細については

Editorial - Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)

の後半に説明されている。

まず、ある桁数 kに対し、すべての 1\leq i\leq Nについて、 A_i k桁目が1か0かを判定して、それぞれの A_iの数を数える。例えば、 k桁目が1の数が C_{k1}で、 k桁目が0の数が C_{k0}の場合、 k桁目関して、合計の結果はC_{k1} \times C_{k0} \times 2^{k-1}となる。

上記の計算を1桁目から A_iの最大桁まで計算し、合計すれば、結果が求められる。