題目鏈接
題目大意
t組數據(t<=100)
給你一個半徑d和步數k,你最開始在原點(0,0)每次可以讓x坐標增加k,或者y坐標增加k
兩人輪流走,求誰最后不能走了,誰就輸了,都是最優博弈
輸的條件為下次走的坐標(x,y)都滿足\(x^2+y^2>d^2\)
題目思路
就是一個對稱博弈
求最遠的到達的(kz,kz)使得\((kz)^2+(kz)^2<=d^2\)
如果\((kz)^2+(kz+k)^2<=d^2\) 則先手勝,否則后手勝
因為后手一定有辦法使得坐標變為(kz,kz),而這個點若不能走,則后手勝
若這個點能走,則先手一定可以到底(kz,kz+k)則這個點可以走的點為(kz+k,kz+k)和(kz,kz+2k)
顯然都已經出界,則先手勝
代碼
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=400+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-5;
ll d,k;
int main(){
int _; scanf("%d",&_);
while(_--){
cin>>d>>k;
ll x=0;
while((x+k)*(x+k)+(x+k)*(x+k)<=d*d){
x+=k;
}
if((x+k)*(x+k)+x*x<=d*d){
printf("Ashish\n");
}else{
printf("Utkarsh\n");
}
}
return 0;
}