[PA2012] Binary Dodgeball

[PA2012]Binary Dodgeball

\(n\) 个盒子,开始时每个盒子中有一个棋子。
两位选手轮流操作,每次可以选择一个 \(i\) 号盒子中的棋子和一个正整数 \(p\),将棋子移到编号为 \(2^p\times i\) 的盒子中。若编号为 \(2^p\times i\) 的盒子中已有棋子了,则这两个棋子都会被移出盒子。不能移动者输。
求第 \(k\) 小的 \(n\),使得手能赢得游戏。

第一个观察是:\(\times 2^p\) 相当于末尾+0。由此发现一个数只能到“最高段”跟他相同的数,其中“最高段”定义为除去后导零得到的数。

尝试将同一类数放到一起考虑;由于加0等价于删0,这个就类似取石子游戏,区别在于“同在则消”的操作,但由于nim的SG只跟xor有关,“同在则消”的操作不会影响它。所以就是nim。整个游戏的SG值为所有数的后导零个数的xor。后手必胜等价于SG=0.

设后导零个数为 \(i\) 的数有 \(cnt_i\) 个,则SG表示为:

\[\bigoplus_{i=0}^{\log}(cnt_i\& 1)\times i \]

\(cnt_i\) 由一阶差分容斥得 \(=(n>>i)-(n>>(i+1))\),因此再想想上式可以转化成

\[\bigoplus_{i=0}^{\log}(n_i\ne n_{i+1})\times i \]

(\(n_i\) 表示 \(n\) 的第 \(i\) 位是 0 还是 1)

\(k\)\(n\) 不难套路地想到二分答案,求 \(\le mid\) 的合法 \(n\) 个数。
可以用一个 \(\log^2\) 数位 dp 轻松计数。
总复杂度 \(\log^3\)

posted @ 2023-03-12 21:51  pengyule  阅读(15)  评论(0编辑  收藏  举报