1 条题解
-
0
这是一道最基础的 博弈论 题目,属于 巴什博弈 (Bash Game) 模型。
1. 算法分析
核心结论:
- 若 ,则 后手 必胜(输出 2)。
- 若 ,则 先手 必胜(输出 1)。
推导过程:
我们将一局游戏中的取石子策略与 这个数字联系起来。为什么是 ?因为无论对手取走 ()颗石子,我总能取走 颗石子,使得两人一轮总共取走的石子数为 。
情况一: 是 的倍数 () 这是 必败态(对于当前要操作的人,即先手)。
- 无论先手取走多少颗石子 (),剩下的石子数 一定不再是 的倍数。
- 后手只需要采取策略:取走 颗石子。
- 这样一轮下来,石子总数减少了 。
- 由于 是 的倍数,后手可以一直维持这个策略,直到最后一次,先手取完后剩下 颗石子,后手一把拿光获胜。
- 结论:后手必胜。
情况二: 不是 的倍数 () 这是 必胜态(对于当前要操作的人,即先手)。
- 设 ,其中 。
- 先手第一步可以直接取走 颗石子。
- 此时剩下的石子数量为 ,即变成了 的倍数。
- 这就相当于把 “面临 倍数石子” 的必败局面丢给了后手。
- 接下来的过程中,无论后手怎么拿,先手都可以利用情况一中的策略(凑 )获胜。
- 结论:先手必胜。
2. 代码逻辑解析
代码非常精简,直接实现了上述的数学结论。
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; // 判断 N 是否能被 (K+1) 整除 if (n % (k + 1) == 0) { // 如果能整除,说明初始状态是必败态,后手必胜 cout << 2; } else { // 如果不能整除,先手可以拿走余数,将必败态丢给对方,先手必胜 cout << 1; } }3. 复杂度分析
- 时间复杂度:。只进行了一次取模判断。
- 空间复杂度:。
4. 总结
巴什博弈的精髓在于构造 常数和(这里是 )。只要总数不是 的倍数,先手就能掌握主动权,始终控制剩余数量为 的倍数,直到胜利。
- 1
信息
- ID
- 6158
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者