第一题: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;
}