这是一个巴什博奕(Bash Game),只要始终保持让对方拿的时候还有(m+1)的倍数个,那么你就胜啦
游戏是这样的:n个物品,每次取1~m个,两个人谁先拿完谁胜
假设:特殊情况是n=m+1,A先拿1~m个怎么都拿不完,但是B怎样都可拿完,A先手必败
一般情况是n=(m+1)*k+s 0<s<=m,如果A拿s个,B拿t个,第一轮结束剩下(m+1)*k-s+s-t=(m+1)*k-t个
这时候,A拿m+1-t个,余下(m+1)*(k-1)个,B拿t个,第二轮结束;第三轮开始A能使得B面临(m+1)的倍数个;最终B只面临m+1个,情况同上,B必输
总结:谁先面临m+1的倍数个谁输,只要拿掉n%(m+1)个就好
class Solution:
def canWinNim(self, n: int) -> bool:
return n%4 != 0
下面是一些博弈论的blog