矩取!

· · 题解

与 CF1149E 本质相同。

思路

考虑每次减小后修改的路径由于是最短的,所以一定是 x + y 上的一段区间。

发现与 CF1149E 很像的一点是都是取走某个位置再修改一些其它位置且去掉修改都为 NIM,启示我们按照 x+y 分组,每组内做 NIM,若每组内异或和均为 0 先手必败否则必胜。

证明类似 NIM,考虑若对于一个存在某组不为 0 的局面,我们可以找到 x+y 最大的异或和非 0 那一组然后修改其中的某个位置(NIM 告诉我们这个位置一定存在),路径终点选择 (1,1),这样就可以修改其它所有组的异或和为零了。

这样先手拿到的一定是异或和非零的局面,后手拿到的一定是异或和为零的局面,先手必胜。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 7;
int n, m, sg[N];
int main() {
    int T;
    cin >> T;
    while (T --) {
        cin >> n >> m;
        for (int i = 1; i <= n + m - 1; i ++)
            sg[i] = 0;
        for (int i = 1; i <= n; i ++)
            for (int j = 1, x; j <= m; j ++)
                cin >> x, sg[i + j - 1] ^= x;
        bool o = 0;
        for (int i = 1; i <= n + m - 1; i ++)
            o |= sg[i];
        cout << (o ? "Ashish\n" : "Jeel\n");
    }
    return 0;
}