每日算法题-Nim 游戏 - 台阶

给定一个台阶数 n,玩家每次可以选择跳跃 1 到 m 个台阶,最后一个台阶到达者获胜。假设两位玩家都采取最优策略,判断先手玩家是否会获胜。

输入格式

一行包含两个整数 nm1 ≤ n, m ≤ 10^9)。

输出格式

如果先手玩家能获胜,输出 "Yes";否则输出 "No"

n, m = map(int, input().split())
if n <= m or n % (m + 1) != 0:
    print("Yes")
else:
    print("No")

 

思路解析

该问题属于博弈论中的巴什博弈(Bash Game)模型,核心在于判断初始状态是否处于必胜态:

  1. 直接胜利条件:当台阶数 n ≤ m 时,先手可以直接跳到终点获胜。
  2. 模运算判断:当 n > m 时,若 n % (m+1) ≠ 0,先手可以通过策略使剩余台阶数变为 (m+1) 的倍数,将必败态转移给对手;反之若余数为0,则无论先手如何操作,后手总能维持这个条件直至胜利。

时间复杂度为 O(1),空间复杂度 O(1),完美支持大数范围。

你可能感兴趣的:(算法,游戏)