题解:洛谷 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
【核心思想】
-
问题分析:给定一个非常大的整数 \(S\)(位数可达 \(10^5\)),两名玩家轮流从石子堆中取走一个正整数回文数个石子,取走最后一个石子(即面对空堆的玩家输)的玩家获胜。Bessie 先手。判断 Bessie 在最优策略下能否获胜。关键观察:这是一个非平凡取石子游戏,但存在简单的必胜/必败判定——根据 \(S\) 的个位数是否为 0。因为若 \(S\) 的个位非零,Bessie 可以取走 \(S\) 的个位数(它是一个一位回文数),使堆的大小变为一个以 0 结尾的数;而面对个位为 0 的堆,无论当前玩家取走多少,剩余个位不可能为 0(因为回文数减 0 结尾的数,结果个位可能为 0 或非 0),但存在一条策略使对手始终面对个位为 0 的情况,最终导致对手失败。更简洁的结论:如果 \(S\) 的个位是 0,则先手必败;否则先手必胜。
-
算法选择:
- 数学规律 + 字符串判定:由于 \(S\) 可以非常大(\(10^{10^5}\)),不能转换为整数。只需读取为字符串,检查最后一个字符是否为
'0'。若是,输出E(Elsie 赢,即后手赢),否则输出B(Bessie 赢)。
- 数学规律 + 字符串判定:由于 \(S\) 可以非常大(\(10^{10^5}\)),不能转换为整数。只需读取为字符串,检查最后一个字符是否为
-
关键步骤:
- 读入:读入测试用例数 \(T\)。
- 对每个用例:读入字符串 \(s\)(表示 \(S\))。
- 判定:若 \(s\) 的最后一个字符等于
'0',则输出"E";否则输出"B"。
-
时间/空间复杂度:
- 时间复杂度:\(O(\sum |S|)\),每个字符串仅检查最后一个字符。
- 空间复杂度:\(O(1)\) 额外空间(存储字符串)。
-
数学规律 + 字符串判定的核心思想:
- 博弈结论:该游戏的胜负完全取决于 \(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 结尾的堆是必败态。
- 适用场景:适用于超大整数输入、且结论仅与最后一位数字相关的博弈问题。核心是发现整数末位的决定性作用,避免大数运算。
- 博弈结论:该游戏的胜负完全取决于 \(S\) 是否为 10 的倍数。证明思路:
【解题思路】

【算法标签】
普及- #字符串入门
【代码详解】
#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
浙公网安备 33010602011771号