取石子

来源:互联网 发布:数值型数据 编辑:程序博客网 时间:2024/05/17 20:30

取石子,最基本的,

两人取一堆,可以取1-m个,共有n个最后取完的人胜利,问先手胜利还是后手胜利

要知道这个问题,我们首先要考虑

我最后一次要取完所以

最后一次对手取完后剩下的石子必须小于等于m个

而对手可以取1-m个

所以我上次取完后必须剩下m+1个

才能保证我必胜那么也就是说只要我取完后剩余的石子数是(1+m)的倍数

那么无论对手怎么取都都无法取成(1+m)的倍数且对手取完后必定有余数

而可以认为0是(1+m)的一个倍数所以对手永远取不到0;

所以如果n是(1+m)的倍数,后手胜利否则先手胜利;


然后进阶一点的就是有数堆石子,每堆有不同的数目,每次可以取任意一堆的任意个(注意至少取1个,可以取完这一堆)

然后我们要考虑,我怎样才能赢,我能赢的结果就是我取完后就是0,

同时我们要考虑有些操作其实类似于无效操作,例如只有2堆,数目相同,那么不管你怎么取,我就和你取相同的,则我必赢

那么这种操作某种程度就是无效的因为有个还原的过程,也就是说你操作后打破了某中平衡,我再进行操作还原这种平衡,

只要我保证这种平衡的最后一定是我赢,那么我就会胜利,而取n堆石子所用到的异或也是如此先将石子数目都化成2进制

进行异或即相同为0,不同为1,(因为在同一位都为1的时候,我可以进行上面的操作,即你取我也取)最后会得到一个数,

如果这个数为0,而同时0的二进制也是0,那么我可以将它看作一个平衡,不管你进行怎样的操作,我都可以将它还原,

而且我可以保证,你进行操作后,这个平衡必会被打破,也就是说你永远都无法得到0,那么我就必赢。这个时候就是后手必赢;

如果不为0那么进行操作使它变成0,先手赢.

0 0
原创粉丝点击