基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 10^18)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
3
3 5
3 4
1 9
Output示例
B
A
A
1.思路:
因为 N <= 10^18,所以对(1.0+sqrt(5))/2的精度要求非常高,需要拆分const ll num[3] = { 618033988, 749894848, 204586834};
模拟过程就是算数3位数乘两位数的过程:
2.代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll num[3] = { 618033988, 749894848, 204586834};
const int mod = 1000000000;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a, b;
cin>>a>>b;
if(a < b)
swap(a,b);
ll cha = a-b;
ll h = cha/mod, l = cha%mod;
ll a1 = l*num[2];
ll a2 = h*num[2] + l*num[1] + a1/mod;
ll a3 = h*num[1] + l*num[0] + a2/mod;
ll a4 = cha + h*num[0] + a3/mod;
if(a4==b)
printf("B\n");
else
printf("A\n");
}
return 0;
}