题目链接

题目大意

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;
}

最新文章

  1. ADO.NET一小记-select top 参数问题
  2. C#汉字转拼音(支持多音字)
  3. ExtJs combobox模糊匹配
  4. 创建GitHub技术博客全攻略
  5. Android的onCreateOptionsMenu()创建菜单Menu详解
  6. Python学习教程(learning Python)--2.3.2 Python函数实参详解
  7. HDU 4614-Vases and Flowers(线段树区间更新)
  8. 转载MVC Html.AntiForgeryToken() 防止CSRF攻击
  9. 在C语言控制台程序中播放MP3音乐
  10. Javascript 之内置对象
  11. Java流读写
  12. js原生设计模式——9外观模式封装2(小型代码库YJ)
  13. 什么是vue?
  14. [刷题]算法竞赛入门经典(第2版) 6-9/UVa127 - &quot;Accordian&quot; Patience
  15. PHP连接数据库、创建数据库、创建表的三种方式
  16. angular学习笔记01
  17. Java Socket通信实现私聊、群聊
  18. java高并发实战(一)——为什么需要并发
  19. [TFS]TFS强制删除离职人员签出锁定项的方法
  20. C++语言的一些问题

热门文章

  1. 硬核!15张图解Redis为什么这么快
  2. Java学习的第十七天
  3. Learn day4 函数参数\变量\闭包\递归
  4. Spring Boot API 统一返回格式封装
  5. Efficient Estimation of Word Representations in Vector Space 论文笔记
  6. c#中简单工厂模式
  7. MVC中Cookie的用法(一)
  8. Pandas_工资集处理
  9. 不小心清空了Ceph的OSD的分区表如何恢复
  10. deepin 安装最新版node