CF1451D Solution

题目链接

题解

博弈论问题。必胜状态(对于先手的),也就是所有一步可以到达的点中至少有一个为必败的点;而必败点则是所有一步可达的点全部为必胜的点。

因为必败点上面或右面的店一定是必胜点,所以必败点与必胜点不在一条对角线上,也就是说一条对角线上的点都是必败点或必胜点。所以只需检查过原点的对角线最靠近圆周的一点是必败点还是必胜点即可。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int t,d,k;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld",&d,&k); int i;
        //寻找原点所在对角线上最靠近圆周的一点
		for(i=k;2*i*i<=d*d;i+=k); i-=k;
        //判断此点下一步是否出界,也就是此点为必败点还是必胜点
		if(i*i+(i+k)*(i+k)>d*d) printf("Utkarsh
");
		else printf("Ashish
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/violetholmes/p/14220561.html