https://codeforces.com/problemset/problem/1451/D
题意翻译
在坐标轴上,有一个以 (0,0)为圆点,dd 为半径的圆。
现在 Ashish 和 Utkarsh 玩游戏,Ashish 是先手。
在 (0,0) 处有一颗棋子,两人轮流将棋子向上或向右移动 kk 个单位,棋子不能移出圆,谁无法移动谁输。
思路:
两条定理
-
必败状态的所有后继状态都是必胜状态
-
必胜状态的至少一个后继状态是必败状态
假设(x,y)是必败点,那么(x+1,y),(x,y+1)是必胜点。
根据本题,(x+1,y+1)胜负隔一个k转化,是必败点。再下去可以发现其实必胜点和必败点是连成一条线的。
(https://www.luogu.com.cn/user/59388的图)
【蓝色表示必败点,红色表示必胜点】
那么我们方便的判断直接判y=x这条线。
那么y=x这条怎么知道是在必胜和必败呢?
我们先假设当前y=x是在必胜。那么人工模拟一下发现实际上这个y=x的最后一个红色的是先手输的,所以实际上图是反的。
那么获得了y=x是必败点的图。
基于此,我们刚才说到了最后一个y=x是蓝色点,如果这个圆的半径稍微扩大一点,也就是刚好把最后一个y=x的蓝色点上面一个(对称的右边一个状态是一样的)包括进来,那么A到了y=x的最后一个蓝色,还有上右可以走一步,一走发现这个时候把决策时刻留给了B。因此可以发现如果y=x的最远一个点上面一个点/右边一个点也在圆内,A获胜,否则B获胜。
求的时候就y=x与圆方程联立求得最远点,/k后表示k步实际上能达到的。然后看其旁边一个点是否在圆内。