E - popcount ≥ K Editorial by maspy


[1] 方針

\(N=1\) は別処理しておきます.

\(N>1\) のとき,\(X\)\(Y=X+C(N-1)\) は異なります.

\(X,Y\) について \(2^K\) の位が異なる」という最大の \(K\) に注目します.

イメージ図
bit:      K.......543210
X  :prefix0.............
Y  :prefix1.............

\(X\) から \(C\) ずつ加算していった際に,はじめて \(2^K\) の桁が繰り上がる瞬間に注目します.繰り上がった直後の値を \(Z\) とします. \(Z\bmod 2^K < C\) であることに注意しましょう.

イメージ図
bit:      K.......543210
X  :prefix0.............
Z  :prefix10000000suffix    suffix に C 未満の非負整数がある
Y  :prefix1.............

\(K\) および suffix を固定するごとに解く.ということを考えます.


[2] 詳細

suffix 部分の popcnt を \(p\) とすると,\(p\leq 5\) です.

\(X\) 側の選び方を考える上で重要なのは,以下の情報です.

  • \(k=0,1,2,3,4,5\) について,以下をすべて満たす \(x\) の最大値.
    • \(0\leq x< 2^K\)
    • \(x\equiv 2^K+\text{suffix}\pmod{C}\)
    • \(\mathrm{popcnt}(x)\leq k\)

\(Y\) 側の選び方を考える上で重要なのは,以下の情報です.

  • \(k=0,1,2,3,4,5\) について,以下をすべて満たす \(y\) の最小値.
    • \(0\leq y< 2^K\)
    • \(y\equiv \text{suffix}\pmod{C}\)
    • \(\mathrm{popcnt}(y)\leq k\)

これらは適当な桁 dp で計算できます(なお,クエリに共通の計算なので事前計算やメモ化などによって,同じ計算を反復することは避けられます).

上の値が手に入っているとして,クエリに答えましょう.\(K\), suffix の場合分けを固定したときの最適解(始点 \(X\) をなるべく小さくしている状況)について考えると,\(Z-X\) としては \(O(\log C)\) 通りの候補しか考える必要がありません.上述の \(x\) が登場する境界のところ,\(X\) から \(Z\) までで \(2^K\) の位が一度しか変わらないという境界,末尾が \(Z\) になるところなどが候補となります.

それらの候補について,\(y\) 側の計算を用いれば,\(2^K\) の位以下の部分についての popcnt の最小値がとれます.よって,prefix 部分の popcnt がいくつ以上であれば条件を満たすかが分かります.それにしたがって prefix に適切な 111111 の形の値を入れれば最適解が得られます.

posted:
last update: