跳至主要內容

1025. 除数博弈

ITCharge大约 1 分钟

1025. 除数博弈open in new window

  • 标签:脑筋急转弯、数学、动态规划、博弈
  • 难度:简单

题目链接

题目大意

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 n。在每个玩家的回合,玩家需要执行以下操作:

  • 选出任一 x,满足 0 < x < nn % 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