题目传送门
题目
Bessie和Elsie正在用一堆石头玩游戏,这些石头最初包含S块石头(1≤S<10105)。两头奶牛轮流转弯,贝西先走。轮到奶牛时,她必须从石头堆中取出x块石头,其中x是奶牛选择的任何正整数回文。如果轮到奶牛时,堆里是空的,那头牛就输了。
有T个(1≤T≤10)独立测试用例。对于每个测试用例,如果两头奶牛都玩得最好,打印谁赢得了游戏。
输入格式:
第一行包含T,即测试用例的数量。接下来的T行描述测试用例,每个测试用例一行。
每个测试用例都由一个整数S指定。
输出格式:
对于每个测试样例,如果Bessie在最佳游戏中获胜,则输出B,从一堆大小为S的石头开始,否则输出E,每一个一行。
样例输入
3
8
10
12
样例输出
B
E
B
回文数详情
- (比如1~9个位数都是,121,1221,789987,45322354……,这些看起来左右对称的数)
那么我们第一眼看到 “两个人拿石子时都要最优”时第一是不是想到要用博弈论,但数据过大,无法进行。
我们不妨换一思路,可以从数学角度入手,我们寻找一下规律,Bessie是先手又要拿一个最优的回文数,所以我们不难发现,当这个石子堆里的石子数量为个位数或石子数量的个位不为0时,那么Bessie是必胜的,反之当石子数量的个位为0时Elsie必胜,我们怎么证明呢?
我们不难证明,当这个数的个位为0时,那么它的最高位应该也为0,然而我们发现这个数是没有前导0的,所以这个数的个位为0是时Elsie必胜。
以下是一个个位为0例子:
S=10
- B:1 E:9
- E胜
以下是一个个位不为0例子:
S=72
- B:54 E:11
- B:2 E:8
- B:2 E:0
- B胜
所以我们只需要根据上述的规律进行一个在程序中的转换即可。
因为这个S的数据范围极大,所以用 long long 也无法储存,所以得用字符串进行输入,取字符串的最后一位进行前面我们找出的规律模拟即可,我们只需要求出S的长度len。
len=s.size();
求出出长度后,我们可以知道S的最后一位是S[len-1],为什么?因为字符串S的第一位是S[0],也就是从0开始,那么len个字符,最后一位就为S[len-1]。
最后,是根据上面总结的AC代码。
AC代码
#include<bits/stdc++.h>
using namespace std;
string S;
int t;
int main()
{
cin>>t;
while(t--)
{
cin>>S;
if(S[S.size()-1]!='0')
{
cout<<"B"<<endl;
}
else
{
cout<<"E"<<endl;
}
}
return 0;
}
完结,感谢阅读。