两个人玩 Nim 游戏,但后手打算在开始游戏前作弊,选择某几堆各拿走一颗石子,从而使自己必胜。问后手最少要拿走几颗石子。若后手无论如何也不能必胜,输出 -1。
Solution
如果不提前拿走石子,那么当 a1⊕a2⊕…⊕an=ans=0 时后手必胜。 设从第 i 堆拿出一个石子,那么对应项 ai 变为 ai−1,相当于等式两边异或上 ai⊕(ai−1)。
注意到 ai⊕(ai−1) 一定形如 2k−1,即每一位都是 1。要让 ans 为 0,即二进制下每一位都是 0,考虑从高位到低位枚举 ans 在二进制下为 1 的位 k,如果存在 i 使得 ai⊕(ai−1) 恰好有 k 位,那么一定从第 i 堆石子拿走一个,等价于使 ans 异或上 ai⊕(ai−1),这样 ans 第 k 位就变为 0。最后,如果无法使 ans=0 则后手必败。