nim游戏 题解
给定一个石子堆序列,你可以向第
i 个石子堆添加x_i 个石子使得\oplus_{i=1}^n(a_i+x_i)=0 ,求出\sum x 的最小值,并求出至多m 种好的方案。第一问的分数占
50\% 。
题目保证了总是存在输出量不大的输出方式,这立刻给我们一个提示:许多好的方案中,只有
先来思考特殊性质 B:
我们有两种转述题意的方式:
- 每位可以分配偶数个
1 ,需要保证分配到每个数上的和\ge a_i 。 - 从高往低更改,扫到第
i 位的时候选择一些此刻该位为0 的数,将该位置1 ,并把它们的低位置0 。
第一种转述方式看上去十分简洁,但本题的关键性质是 更改量 相比之前不大,所以我们采用第二种理解方式。
有性质:在
我们来证明这个结论。
假设我们在第
i 位更改了\ge 2 个数,随便挑选其中的两个数,令它们的低位是x,y ,则代价是2^i-x+2^i-y ,对总异或和的影响是x\oplus y 。考虑低位的合法方案,我们可以花费至多
x\oplus y 的代价(在a_1 上)构造一个新的合法方案。这个方案和原方案的代价差小于
x\oplus y-(2^i-x+2^i-y) ,显然x\oplus y+x+y<2^{i+1} (x,y,x\oplus y 三个数中每位至多两个1 )。所以我们证明了原方案不优。
并且新方案的低位多了
x,y 可以选择,若选择它们还可以减少代价。
然后我们可以继续猜结论:选择低位更大的数,总是不劣于低位更小的数。
这个好证,假设我们有两个选项其低位是
x,y,x>y ,假设我们选了y ,贡献是2^i-y ,若后面x 都没有被选,则显然换成x 更优。若之后
x 又被选了,找出x 被选的最高位j ,若j\ge x,y 的\rm lcp ,显然x,y 选哪个是一样优的,若j<\text{lcp} ,则y+(x\bmod 2^j)\le x ,这意味着我们直接高位选x ,然后在x 空出来的第j 位上选一个都不劣。
这样我们就会了第一问,如果要选的话,我们直接选择低位最大的数即可,提前把
需要注意的是,我们的爆搜过程只会向一个地方递归,即选
如果你把每位按照
有了第二个结论,第二问也是简单的,每位从高往低顺着搜,不合法了立刻停止即可,每次不合法最多拉出一条
在没了特殊性质 B 的情况下,我们发现当我们没
需要注意的是,在搜索第二问的过程中,使用不同的