题目链接:https://codeforces.ml/contest/1451/problem/D
题意:A和U两个任玩游戏,最开始一个点在(0,0)。现在给定两个整数1<=d<=1e5,1<=k<=d。A先走,每次必须在横或者纵坐标上加上k。且(x,y)必须满足x*x+y*y<=d*d。如果一方不能走了则证明输了。
题解:博弈问题,很公平的博弈问题。开始以为要用到sg函数什么的,又不会emmm看来啥时候得去学一学了。差点忽略了cf以考查思维为主。
能打表的可以直接打表,然后分析规律。(x+y)%2==1为A,(x+y)%2==0为U。现在以k=1打表。
d=10:
10
1|||U A U A U A U A U
2|||A U A U A U A U A
3|||U A U A U A U A U
4|||A U A U A U A U A
5|||U A U A U A U A
6|||A U A U A U A U
7|||U A U A U A U
8|||A U A U A U
9|||U A U A
10|||
分析边界,从上到下U,A,U,A,U,U,U,A,U,A,U。U多一些所以U必胜。(开玩笑的哈哈)。
本来打到这里就想要直接写代码比如这里p=7.即到(7,7)的时候没有后继状态了,那么就一定U胜了。但是思路没有清晰,实现这个功能的代码也没有打出来(打了一下也没调就放弃了,决定还是思想,不然也没啥用,还是不懂,而且大概率WA,反正时间还多,大不了最后几分钟再猜。于是又思考了半小时(菜鸡畏难不解释)终于等来了思路明晰的那一刻)。
。。。。。。推导A的必胜,必败状态。
最后思路:(x,y),x==y时一定为U,如果取最大的x,(x,y)没有后继状态的话一定U胜,因为首先A到(1,2)((2,1)一样的因为对称),然后U(2,2),然后不管A怎么走,U总能总到(x,y)x==y。所以U胜。
如果(x,y),x==y且(x,y)有后继状态。那么A先到(1,2),然后无论U怎么走,A都能直接到挨着对称轴U的一条全为A的线上的点(即x,x+1),所以A胜。不得不说很巧妙啊。
###########################################################
总结:
1.博弈问题:思考一个人是否能将博弈拉到某个特定状态(这个状态有利于自己)。这是最常见的博弈思维题的思维方式了,之前没看博弈论都是这样干的,怎么看了博弈论之后就,看到博弈题目就往sg上想了???我认为,cf一般不会考到那么的难。
代码:
#include <bits/stdc++.h>
#define ll long long
#define ld double
#define pi acos(-1)
#define pb push_back
#define mst(a, i) memset(a, i, sizeof(a))
#define pll pair<ll, ll>
#define fi first
#define se second
#define mp(x,y) make_pair(x,y)
#define rep(i,a,n) for(ll i=a;i<=n;i++)
#define per(i,n,a) for(ll i=n;i>=a;i--)
#define dbg(x) cout << #x << "===" << x << endl
#define dbgg(l,r,x) for(ll i=l;i<=r;i++) cout<<x[i]<<" ";cout<<endl
using namespace std;
template<class T>void read(T &x){T res=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){res=(res<<3)+(res<<1)+c-'0';c=getchar();}x=res*f;}
inline void print(ll x){if(x<0){putchar('-');x=-x;}if(x>9)print(x/10);putchar(x%10+'0');}
const ll maxn = 1e5 + 10;
const ll mod = 1e9+7;
ll d,k;
//ll inv(ll a){return a==1?1:(ll)(mod-mod/a)*inv(mod%a)%mod;}
//ll gcd(ll a,ll b){return (b==0)?a:gcd(b,a%b);}
//ll qpow(ll a,ll p,ll mod){ll ans=1;a=a%mod;while(p){if(p&1)ans=(ans*a)%mod;p>>=1;a=(a*a)%mod;}return ans;}
int main() {
ll _s = 1;
read(_s);
//freopen("testdata.in","r",stdin);
//freopen("testout.out","w",stdout);
for (ll _=1;_<=_s;_++) {
read(d),read(k);
ll p=1;
for(ll i=1;;i++){
if((i*k)*(i*k)+(i*k)*(i*k)>d*d){
p=i;break;
}
}
--p;
// dbg(p);
bool f=true;
ll t=p*p*k*k+k*k*(p+1)*(p+1);
// dbg(t);
if(t<=d*d) f=true;
else f=false;
puts(f?"Ashish":"Utkarsh");
}
return 0;
}
/*
input:::
Utkarsh
Ashish
Utkarsh
Utkarsh
Ashish
output:::
*/