1 条题解
-
0
问题分析
我们有一个 堆石子的游戏,石子堆满足 。每次可以从任意一堆中取走正整数个石子,但取完后必须保持序列的单调不降性质。无法操作者输,Jaś 先手。
这是一个典型的公平组合游戏,我们需要判断先手是否必胜。
关键观察
1. 问题转化
考虑序列的差分数组:
由于原序列单调不降,所有 。
2. 操作分析
当我们从第 堆取走 个石子时:
- 减少
- 为了保持 和 ,实际上相当于:
- 减少
- 增加
换句话说,一次操作相当于:
- 选择一个位置
- 从 中取走 个石子
- 将这些石子加到 中
3. 游戏等价
这正好是阶梯Nim游戏的定义!
在阶梯Nim中:
- 有一个阶梯,每级上有一些石子
- 每次可以将某一级的一些石子移到下一级
- 最后一级的石子直接移出游戏
- 无法操作者输
在我们的问题中:
- 就是阶梯上的石子
- 从 取石子加到 相当于将第 级的石子移到第 级
阶梯Nim的解法
定理
在阶梯Nim中,先手必胜当且仅当奇数位置上的石子数的异或和不为 。
证明思路
- 偶数位置上的石子可以"免费"移动到奇数位置
- 实际上只有奇数位置上的石子影响胜负
- 将奇数位置看作独立的Nim堆
具体解法
对于输入序列 :
- 计算差分序列:(设 )
- 计算所有奇数下标 的异或和:
- 如果 ,先手必胜,输出
TAK - 如果 ,先手必败,输出
NIE
复杂度分析
- 时间复杂度: 每个测试用例
- 空间复杂度: 存储序列
样例验证
样例1
n = 2 a = [2, 2]差分序列:
奇数位置异或和: ❌
实际上输出NIE,说明我们的下标编号需要注意。修正:在阶梯Nim中,我们通常从第 级开始编号。
对于 ,奇数位置是对于 :
- (奇数位置)
- (偶数位置)
异或和 = ,但样例输出
NIE,这似乎矛盾。
关键修正
实际上,在标准的阶梯Nim中,从地面开始编号:
- 地面是第 级
- 对应第 级
- 对应第 级
- ...
因此,我们应该考虑偶数下标的 !
正确解法
计算所有偶数下标 的异或和。
重新验证样例
样例1
a = [2, 2] b = [2, 0]偶数下标:
异或和 = ⇒ 先手必败 ⇒NIE✓样例2
a = [1, 2, 4] b = [1, 1, 2]偶数下标:
异或和 = ⇒ 先手必胜 ⇒TAK✓总结
本题的解法:
- 将原序列转化为差分序列
- 计算所有偶数位置差分值的异或和
- 异或和不为 则先手必胜,否则先手必败
这种将复杂游戏转化为经典博弈模型的思想在竞赛中非常常见,关键是找到正确的转化方法。
- 1
信息
- ID
- 3774
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者