第一题:PALINDROME GAME
标签:思维、博弈
题意:给定一堆石子,有 S S S个( 1 ≤ S ≤ 1 0 1 0 15 1≤S≤10^{10^{15}} 1≤S≤101015), B e s s i e Bessie Bessie和 E l s i e Elsie Elsie轮流拿回文正整数个石子, B e s s i e Bessie Bessie先手,当轮到一个人的时候 石子堆空了,该人输。两个人都执行最优策略,求谁会赢?
题解: S S S数据很大,显然不能直接暴力模拟。我们可以找几个数据,推一推。
一位数的情况, B e s s i e Bessie Bessie直接拿走获胜。
两位数的情况,比如 10 10 10, B e s s i e Bessie Bessie至少得拿一个,不管拿多少个,剩下来都是一位数, E l s i e Elsie Elsie赢。 11 、 12 、 13...19 11、12、13...19 11、12、13...19的情况, B e s s i e Bessie Bessie可以把个位直接拿走,留 10 10 10给 E l s i e Elsie Elsie, B e s s i e Bessie Bessie赢。
具体再看看 S = 119 S=119 S=119之类的,发现只要 B e s s i e Bessie Bessie把个位拿走,留 110 110 110给 E l s i e Elsie Elsie,也是必胜的,只要 E l s i e Elsie Elsie更改, B e s s i e Bessie Bessie把个位多余的拿走,最后就能留 10 10 10给 E l s i e Elsie Elsie。
推了下,我们发现个位为 0 0 0的为必败态,所以最终只要判 S S S个位是否为 0 0 0,就能知道是谁赢了。
代码:
#include <bits/stdc++.h>
using namespace std;int main() {int t;cin >> t;while (t--) {string s;cin >> s;int n = s.size();if (s[n - 1] != '0') cout << "B" << endl;else cout << "E" << endl;}return 0;
}