题解:洛谷 P10187 Palindrome Game

【题目来源】

洛谷:P10187 [USACO24FEB] Palindrome Game B - 洛谷

【题目描述】

贝西和埃尔西正在用一堆最初包含 \(S\) 个石头的石头玩游戏\((1\le S\le 10^{10^5})\)。他们俩只奶牛轮流进行游戏,贝西先开始。当轮到一头奶牛的时候,她必须从堆中移走 \(x\) 个石头,其中\(x\)是她选择的任何正回文整数。如果一头奶牛开始拿石头时堆为空,那么这头奶牛就输了。

定义:一个正整数是回文数,如果它正着读和倒着读都是一样的;回文数的例子包括 \(11\)\(121\)\(9009\)。不允许前导零;例如,\(990\)不是回文数。

\((1\le T\le 10)\)个独立的测试用例。对于每个测试用例,如果两头奶牛都以最优策略玩游戏,输出谁赢了游戏。

【输入】

第一行包含T,即测试用例的数量。接下来的 \(T\) 行描述了测试用例,每个测试用例占一行。

每个测试用例由一个单独的整数\(S\)指定。

【输出】

对于每个测试用例,如果贝西在最优策略下从大小为 \(S\) 的石头堆开始玩游戏并获胜,则输出 \(B\);否则,输出 \(E\)

【输入样例】

3
8
10
12

【输出样例】

B
E
B

【核心思想】

  1. 问题分析:给定一个非常大的整数 \(S\)(位数可达 \(10^5\)),两名玩家轮流从石子堆中取走一个正整数回文数个石子,取走最后一个石子(即面对空堆的玩家输)的玩家获胜。Bessie 先手。判断 Bessie 在最优策略下能否获胜。关键观察:这是一个非平凡取石子游戏,但存在简单的必胜/必败判定——根据 \(S\)个位数是否为 0。因为若 \(S\) 的个位非零,Bessie 可以取走 \(S\) 的个位数(它是一个一位回文数),使堆的大小变为一个以 0 结尾的数;而面对个位为 0 的堆,无论当前玩家取走多少,剩余个位不可能为 0(因为回文数减 0 结尾的数,结果个位可能为 0 或非 0),但存在一条策略使对手始终面对个位为 0 的情况,最终导致对手失败。更简洁的结论:如果 \(S\) 的个位是 0,则先手必败;否则先手必胜

  2. 算法选择

    • 数学规律 + 字符串判定:由于 \(S\) 可以非常大(\(10^{10^5}\)),不能转换为整数。只需读取为字符串,检查最后一个字符是否为 '0'。若是,输出 E(Elsie 赢,即后手赢),否则输出 B(Bessie 赢)。
  3. 关键步骤

    • 读入:读入测试用例数 \(T\)
    • 对每个用例:读入字符串 \(s\)(表示 \(S\))。
    • 判定:若 \(s\) 的最后一个字符等于 '0',则输出 "E";否则输出 "B"
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\sum |S|)\),每个字符串仅检查最后一个字符。
    • 空间复杂度:\(O(1)\) 额外空间(存储字符串)。
  5. 数学规律 + 字符串判定的核心思想

    • 博弈结论:该游戏的胜负完全取决于 \(S\) 是否为 10 的倍数。证明思路:
      • \(S\) 的个位非零,Bessie 可取走 \(d = S \bmod 10\)(一位回文数),使新堆大小为 \(S - d\),其个位为 0。
      • 若当前堆 \(S\) 的个位为 0,无论玩家取走一个回文数 \(x\)\(x\) 的个位可以是 1-9 或 0),剩余 \(S - x\) 的个位不可能为 0(除非 \(x\) 个位为0,但回文数不可能以0结尾,因为不允许前导零)。因此,对手总是面对个位非零的堆,进而可以重复上述策略,最终迫使对方面对空堆(0 也以 0 结尾)而输。因此以 0 结尾的堆是必败态。
    • 适用场景:适用于超大整数输入、且结论仅与最后一位数字相关的博弈问题。核心是发现整数末位的决定性作用,避免大数运算。

【解题思路】

【算法标签】

普及- #字符串入门

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
    cin >> t;  // t组数据
    while (t--) {
        cin >> s;  // 以字符串形式输入
        if (s[s.size()-1]=='0') cout << "E" << endl;  // 如果最后一位为0,则埃尔西赢
        else cout << "B" << endl;  // 否则一定贝西赢
    }
    return 0;
}

【运行结果】

3
8
B
10
E
12
B
posted @ 2026-08-28 15:53  团爸讲算法  阅读(2)  评论(0)    收藏  举报