1 条题解

  • 0
    @ 2025-12-11 22:02:52

    这是一道最基础的 博弈论 题目,属于 巴什博弈 (Bash Game) 模型。

    1. 算法分析

    核心结论:

    • N%(K+1)==0N \% (K+1) == 0,则 后手 必胜(输出 2)。
    • N%(K+1)0N \% (K+1) \neq 0,则 先手 必胜(输出 1)。

    推导过程:

    我们将一局游戏中的取石子策略与 K+1K+1 这个数字联系起来。为什么是 K+1K+1?因为无论对手取走 xx1xK1 \le x \le K)颗石子,我总能取走 y=(K+1)xy = (K+1) - x 颗石子,使得两人一轮总共取走的石子数为 K+1K+1

    情况一:NNK+1K+1 的倍数 (N%(K+1)==0N \% (K+1) == 0) 这是 必败态(对于当前要操作的人,即先手)。

    • 无论先手取走多少颗石子 xx (1xK1 \le x \le K),剩下的石子数 N=NxN' = N - x 一定不再是 K+1K+1 的倍数。
    • 后手只需要采取策略:取走 K+1xK+1-x 颗石子。
    • 这样一轮下来,石子总数减少了 K+1K+1
    • 由于 NNK+1K+1 的倍数,后手可以一直维持这个策略,直到最后一次,先手取完后剩下 1K1 \sim K 颗石子,后手一把拿光获胜。
    • 结论:后手必胜。

    情况二:NN 不是 K+1K+1 的倍数 (N%(K+1)0N \% (K+1) \neq 0) 这是 必胜态(对于当前要操作的人,即先手)。

    • N=m×(K+1)+rN = m \times (K+1) + r,其中 1rK1 \le r \le K
    • 先手第一步可以直接取走 rr 颗石子。
    • 此时剩下的石子数量为 m×(K+1)m \times (K+1),即变成了 K+1K+1 的倍数。
    • 这就相当于把 “面临 K+1K+1 倍数石子” 的必败局面丢给了后手。
    • 接下来的过程中,无论后手怎么拿,先手都可以利用情况一中的策略(凑 K+1K+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. 复杂度分析

    • 时间复杂度O(1)O(1)。只进行了一次取模判断。
    • 空间复杂度O(1)O(1)

    4. 总结

    巴什博弈的精髓在于构造 常数和(这里是 K+1K+1)。只要总数不是 K+1K+1 的倍数,先手就能掌握主动权,始终控制剩余数量为 K+1K+1 的倍数,直到胜利。

    • 1

    信息

    ID
    6158
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者