多堆NIM问题

来源:互联网 发布:中国手机网络发展现状 编辑:程序博客网 时间:2024/05/24 03:22

n堆小石子,两个人拿,每一堆的数目不固定,一次只可以从一堆里面拿,可以拿任意个,但是至少要拿一个,最多全拿走;拿走最后一个石头的赢。

例如:三堆石子,分别为1,2,3;

A从第三堆中拿2个,变成1,2,1;然后B把第二堆全拿走,变成1,1;那么A就只能拿一个了,最后一个B拿,B赢。

如何能必胜呢?

必胜的一个最基本的情况就是上述最后,剩下两堆给对手,每堆1个,这样他怎么拿都必输了。接着向上拓展,如果是两堆,每堆两个,那么对面的也是怎么拿都必输。更一般的情况,只要给对手留下两堆数量相同的,那么就必胜了,因为每次都能保持两堆相同的留给对手,每次石子都会减少,那么最后一定是两堆各一个留给对手。那么更多堆的情况呢?实际上我们可以灵机一动,发现必胜的特点,就是各堆的数目异或结果是0;只要我们能够保持这种特点,异或为0,每次石子都会减少,那么最后也一定是两堆一样的留给对手。

为什么一定可以保持呢?

只要我们刚开始留给对手的是异或为0的结果,那么不管他怎么拿,我们都可以保持这种性质。

各堆数目异或为0,就表示各堆数目的二进制表示中,每一位上1的数目一定为偶数。例如1,2,3,分别为1,10,11,低位开始数,第一位上1的数目为2,第二位的数目也为2,这样他们异或的结果就是0了,事实上从异或的特点就能看出这一点了。所有的0异或结果必然是0,只要所有的1异或结果为0,那么这个位上的异或结果就是0了。所以,如果初始条件下,异或结果为0,那么对手拿了某一堆里面的某几个,必然破坏了这种性质,因为他改变的只是一个数,那么这个数上的某几位的1可能变成了0,某几位的0可能变成了1,必然改变了这种奇偶性。所以异或结果必然就不是0了,那么为什么我们一定可以保持呢?对手改变了某一个数字二进制表示的1,0的分布情况,因为他只能做减法,所以他改变的最高位必然是从1变到0,而之前的结果异或结果是0,其他的堆的数目的二进制表示必然至少有1个在该位上也是1,就取其中的一个,然后把他改变的其他的位的变化也用二进制表现出来。

例如:1,4,5;异或结果为0;

二进制表示分别为1,100,101;

假如他从第三堆拿了2个,那么就变成1,4,3,二进制表示为:1,100,011

第三位的1被拿掉,第二位的0变成了1

那么我就取掉第二堆中的第三位的1,并且,第二位的0也改成1,其他的不动,我们要剩下的就是010,为2,4-2=2,所以我们就从第二堆中取掉2个。剩下2个,给对手留下的就是1,2,3;异或结果为0;

依次类推,每次石子都会减少,最后剩下的依然异或为0;

必胜。