有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。
例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。(输入的N可能为大数)
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000) 第2 - T + 1行:每行1个数N。(1 <= N <= 10^1000)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
3 2 3 4
Output示例
A B A
SG找规律,发现3的倍数,第二部,N很大,每位相加能否整除3(小学的性质诶。。。居然忘了)
#include<bits/stdc++.h>
//#include <iostream>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 10005
#define inf 1e18
typedef long long ll;
const ll mod = 100;
ll T,ans,sg[maxn],f[maxn] = {1,2,4,8,16,32,64,128},arr[maxn];
string n;
bool flag[maxn];
/*void getsg(ll x)
{
memset(sg,0,sizeof(sg));
for(ll i = 1; i <= x; i++)
{
memset(flag,0,sizeof(flag));
for(ll j = 0; f[j]<=i && j < 8; j++)
flag[ sg[ i-f[j] ] ] = 1;
for(ll j = 0; ; j++)
if(flag[j] == 0)
{
sg[i] = j;
break;
}
}
return ;
}*/
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> T;
//getsg(maxn);
while(T--)
{
cin >> n;
ll num = 0;
for(ll i = 0; i < n.size(); i++)
num += n[i]-'0';
if(num%3!=0)
cout << "A" << endl;
else
cout << "B" << endl;
}
return 0;
}