1025. 除数博弈
大约 1 分钟
1025. 除数博弈
- 标签:脑筋急转弯、数学、动态规划、博弈
- 难度:简单
题目链接
题目大意
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 n
。在每个玩家的回合,玩家需要执行以下操作:
- 选出任一
x
,满足0 < x < n
且n % x == 0
。 - 用
n - x
替换黑板上的数字n
。 - 如果玩家无法执行这些操作,就会输掉游戏。
只有在爱丽丝在游戏中取得胜利时才返回 True
,否则返回 False
。假设两个玩家都以最佳状态参与游戏。
解题思路
- 如果
n
为奇数,则n
的约数必然都是奇数;如果n
为偶数,则n
的约数可能为奇数也可能为偶数。 - 无论
n
为奇数还是偶数,都可以选择1
作为约数。 - 无论
n
初始为多大的数,游戏到最终只能到n == 2
结束,只要谁先到n == 2
,谁就赢得胜利。 - 当初始
n
为偶数时,爱丽丝只要一直选1
,那么鲍勃必然会一直面临n
为奇数的情况,这样最后爱丽丝肯定能先到n == 2
,稳赢。 - 当初始
n
为奇数时,因为奇数的约数只能是奇数,奇数 - 奇数 必然是偶数,所以给鲍勃的数一定是偶数,鲍勃只需一直选1
就会稳赢,此时爱丽丝稳输。
所以,当 n
为偶数时,爱丽丝稳赢。当 n
为奇数时,爱丽丝稳输。
代码
class Solution:
def divisorGame(self, n: int) -> bool:
return n & 1 == 0