Official

Ex - Popcount Sum Editorial by cn449


問題を bit ごとに分解して考えます。すなわち、\(k = 0,1, \ldots 29\) に対して以下の問題を解きます。

  • \(1\) 以上 \(N\) 以下の整数であって、\(M\) で割った余りが \(R\) になるもののうち、二進表記したときに \(2^k\) の位が \(1\) となるものの個数を求めよ。

すべての \(k\) に対する上の問題の答えを足し合わせることで、本問題の答えを得ることができます。

ここで、正整数 \(A\) に対して

  • \(A\) を二進表記したときに \(2^k\) の位が \(1\)
  • \(2^k \leq (A \bmod 2^{k+1}) < 2^{k+1}\)
  • \([\frac{A+2^k}{2^{k+1}}]-[\frac{A}{2^{k+1}}]=1\)

\(3\) つは同値です。

したがって、条件を一番下の形に言い換えることによって floor sum を用いて答えを求めることができます。

\(k\) に対して \(O(\log N)\) の計算量で答えを求めることができるので、\(1\) つのテストケースにつき計算量は \(O((\log N)^2)\) です。

posted:
last update: