题意
Alice和Bob又来做游戏啦!
这次他们做的是,给你一个直径为d的圆,现在有一枚棋子位于(0,0)原点,每一次操作可以把棋子向右或者上方移动一个单位长度,Alice先手,Bob后手,棋子只能位于圆中,不能移动则失败,请输出赢者。
思路
这道题和在桌面上放硬币的思路非常相似:
先手先占据桌子的中心位置,那么后手无论怎么放置,我们的先手都可以按着这个中心对称的位置跟着放就可以了,因此先手必赢。
那么按着这个思想。
我们现在设
x
x
x是
2
∗
(
x
∗
k
)
2
<
=
d
2
2*(x*k)^2<=d^2
2∗(x∗k)2<=d2的最大值,那么如果在这个点能向左走,或者向上走,那么就是先手赢(必赢局面),反之则是先手必败局面,那么前2*x局,因为双方都走的是偶数局面,因此必赢局面的人对于必输局面的人只要操作完全相反就可以了,(只要给你带到xk,xk)这个点就赢了啊。因此我们只用判断这个临界点还能不能走就可以了。
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
long long d,k;
cin>>d>>k;
long long m=d*d/2;
long long p=sqrt(m);
long long n=p/k*k;
if(2*n*n+2*k*n+k*k<=d*d)cout<<"Ashish"<<endl;
else cout<<"Utkarsh"<<endl;
}
}