正题
题目链接:https://www.luogu.com.cn/problem/CF1451F
题目大意
n∗mn*mn∗m的网格,每个网格上有数字,先后手轮流操作
每次操作选择一个只有往右和往下的路径,让第一个格子减去一个正整数并且随意修改后面的格子。要求完成后所有格子非负,无法操作者输,求先手能否必胜。
解题思路
我们每一斜列分开考虑,即x+yx+yx+y相同的格子归为一类。
那么一类的格子操作时可以随意修改后面类格子的异或和,也就算一类的格子的最后一手可以决定后面类的胜负。
但是我们可以通过选择下面的格子来转换先后手,但是这么做同理后手也可以这么做,所以只有所有类的异或和都为000时,先手一旦操作就会使得至少有一个类为正,然后后手必胜。否则先手都是必胜的。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,m,a[11000];
int main()
{scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<n+m;i++)a[i]=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int x;scanf("%d",&x);a[i+j-1]^=x;}bool flag=0;for(int i=1;i<n+m;i++)if(a[i]){flag=1;break;}if(flag)printf("Ashish\n");else printf("Jeel\n");}return 0;
}