此题为威佐夫博弈,表面看其实不难,但是其给出的样例数据确实非常恐怖。对于小数的优化必须做到高精度的优化才可以pass。
做法:
将(sqrt(5)+1)/2 分为3段,分别用数组保存,呐,两个数相乘,小数和整数是可以互相转换的,将其转化为整数,将x与y之差转化为小数,分为三段则再将其拆分,ps:(0.234*8=0.2*8+0.03+8+0.004*8),很明显可以看出程序处理办法。注意,设Z为xy之差,Z/MOD*相应的段会产生进位,则将其放入下一迭代乘法之中。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1000000000;
ll t[3] = {618033988,749894848,204586834};
int main()
{
int m;
cin>>m;
while(m--){
ll a,b;
cin>>a>>b;
if(a>b)
swap(a,b);
ll cha = b - a;
ll tp,mo,sh;
mo = cha%MOD, sh = cha/MOD;
tp = mo * t[2];
tp = tp/MOD+mo*t[1]+sh*t[2];
tp = tp/MOD+mo*t[0]+sh*t[1];
tp = cha+tp/MOD+sh*t[0];
if(tp == a)
cout<<"B"<<endl;
else
cout<<"A"<<endl;
}
return 0;
}