博弈论部分:
有n堆石子,第i堆有ai个,每次可以选择一堆石子取走若干个(不能不取),然后选择不动或者将这堆石子剩余部分与另外一堆石子个数大于0的石子合并,问先手是否存在必胜策略。
solution :
(1)首先,当堆数为1时,显然先手必胜。
(2)当有偶数堆时
<1> 可以选择将偶数堆变为奇数堆
<2> 当 (a1−1) xor (a2−1) xor...xor (an−1)=0 时,经过一系列步骤在石子堆数变为奇数堆时后手,反之若异或和不为0,可以先/后手。
(3)当有奇数堆(堆数>2)时,先手可以将堆数变为偶数,且使 (a1−1) xor (a2−1) xor...xor (an−1−1)=0
下面给出(3)的证明:
假设当前有(a1−1) xor (a2−1) xor...xor (an−1)=k
我们希望将某个ai拿取一部分并进行调整,某个aj−1变为(aj−1) xor (ai−1) xor k,且有(aj−1) xor k>aj−1和(aj−1) xor k−(aj−1)≤ai−1
为了方便,接下来的讨论默认每个ai减一
针对题解的取石子堆数的最大值操作,给出反例
26 25 22 17 3
假设我们对26这一堆进行操作
每个石子堆均-1可得:
25 24 21 16 2
我们可以将[0,25]个石子放到某一堆上
观察到24^21^16^2=31
24^31=7
21^31=10
16^31=15
2^31=29
所以只能将[0,25]个石子加到2这一堆
但是2+25<29所以不能将异或和变为0
我们假设k的第t位(最高位)为1,则一定存在至少1个ai的第t位为1,我们选出某个第t位为1的ai,此时 k xor ai的第t位为0。
<1>若ai xor k=0,则直接全部取空即可。
<2>若ai的前t−1位不都为0,则ai xor k的最高位在前t−1位(假设为第s位,ai的第s位也为1)出现,则此时剩余的石子堆数有奇数堆第s位为1。
-
若第t位为1的堆数均在前面所述的奇数堆出现(偶数次),则存在第s位为0且第t位为0的石子堆j且aj xor ai xor k>aj,因为ai的第t位为1,所以有aj xor ai xor k−aj≤ai。
-
若第t为为1的堆数不都出现在前面所述的奇数堆,则存在第s位为0且第t位为1的石子堆j且aj xor ai xor k>aj,显然此时aj xor ai xor k−aj≤ai。
<3>若ai的前t−1位都为0,则剩下的石子堆里若 aj xor ai xor k>aj,该石子堆可以调整至 aj xor ai xor k,这是因为ai的第t位为1,而aj第t为0时,aj xor ai xor k第t位也为0,aj第t位为1时,aj xor ai xor k第t位也为1,怎么调整石子都是够的。
- 因此只需证明∃j,aj xor ai xor k>aj,假设ai xor k最高的为1的位为第r位(一定存在),所以该位为1的有奇数堆,因为总共有偶数堆,则存在某个堆的石子个数第r位为0,得证。
综上所述,当石子堆数为偶数且(a1−1) xor (a2−1) xor...xor (an−1)=0时先手必败,否则先手必胜。