题解:CF1451D Circle Game

· · 题解

题目

圆心在原点,半径为 d 的圆内有一枚棋子,初始位于 (0,0)。两人轮流行动,先手先走。每一步必须恰好执行以下一种操作:

移动后棋子仍须满足 $x^2 + y^2 \le d^2$。无法行动者输。双方均采用最优策略,判断谁获胜。 #### 思路 参考博弈题的常见思路,将点(图中在圆内且坐标为整数的点)分为必胜点和必败点。其中必败点即为无法进行下一步操作的点,必胜点则反。显然能走到必胜点都是必败点。 手画一个图即可发现,原点的输赢情况只与对角线 $y=x$ 上能到达的最后一个点的输赢情况有关,所以我们仅需判断此点即可。判断方法见代码。 #### 代码 ```cpp #include<bits/stdc++.h> #define ll long long using namespace std; ll t,d,k; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>t; while(t--){ cin>>d>>k; ll b=floor(sqrt((d*d)/2.0)); //y=x上离圆最近且在圆内的点的横纵坐标 ll c=(b/k)*k; //y=x离原点最远能到达的横纵坐标 if((c+k)*(c+k)+c*c<=d*d) //能否再走一步 cout<<"Ashish"<<'\n'; else cout<<"Utkarsh"<<'\n'; } return 0; } ```