给出 N 堆石子,现有两个人轮流取石子。假设当前这堆石子个数为 n,那么一个人进行一次操作后,剩余石子数 k 必须满足: 0<k<n 且 n⊕k<n。完成此次操作后会新增一堆数量为 n⊕k 的石子。
除此之外,每个人有一次进行特殊操作的机会,使增加的一堆的石子数从 n⊕k 变为 2n⊕k 。问是否先手必胜。
Solution
考虑每一次操作。经过一次操作(先不考虑特殊操作),一堆 n 个石子会变成数目为 k 和 k⊕n 的两堆,且这两堆都小于 n,同时,分开后的两堆数石子在二进制下 1 的个数总和与 n 在二进制下 1 的个数的奇偶性相同。
容易发现,当每一堆石子个数都是 2 的次幂则无法继续操作,当前操作者输。设一堆 n 个石子被拆成 m 堆,每堆都不可再分,则每堆二进制下都只有 1 个 1, 即 n 在二进制下 1 的个数和 m 同奇偶。又因为分成 m 堆需要 m−1 次操作,那么操作次数和 n 在二进制下 1 的个数的奇偶性是相反的,也就是说如果 n 在二进制下的 1 的个数是偶数,则会进行奇数次操作,即先手必胜。
对于特殊操作,2k 和 2k⊕n 这两堆二进制下 1 的个数之和与 n 在二进制下 1 的个数同奇偶,而 2k=k<<1 和 k 在二进制下 1 的个数相同,因此对总的操作次数没有影响。