Chess
.
.
经典博弈问题,sg函数的应用,因为m<=20,用状态压缩存储就好了。
.
.
队友代码
#include <bits/stdc++.h>
using namespace std;
int a[2000002];
int p[50];
int b[50];
int s[50];
int T;
int n, m;
int x;
int ans;
void makefull()
{
p[1] = 1;
for (int i = 2; i < 25; i++)
p[i] = 2*p[i-1] + 1;
}
int main()
{
for (int i = 0; i < 1048576; i++)
a[i] = -1;
a[0] = 0;
makefull();
for (int i = 1; i <= 20; i++)
a[p[i]] = 0;
for (int i = 1; i < 1048576; i++)
if (a[i] == -1)
{
for (int j = 0; j < 20; j++)
s[j] = 0;
int t = i, len;
for (len = 1; t > 0; len++)
{
b[len] = t & 1;
t>>=1;
}
for (int ii = 1; ii < len; ii++)
{
if (b[ii] == 0)
{
for (int jj = ii+1; jj < len; jj++)
{
int yuan = (i%(1<<jj))>>ii;
if ((yuan) == p[jj-ii])
{
int pos = i-(yuan<<ii)+(yuan << (ii-1));
s[a[pos]] = 1;
}
else break;
}
}
}
for (a[i] = 0; s[a[i]]; a[i]++);
}
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
ans = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &m);
x = 0;
for (int j = 1; j <= m; j++)
{
int xx;
scanf("%d", &xx);
xx = 20 - xx;
x += (1<<xx);
}
ans ^= a[x];
}
if (ans > 0) puts("YES");
else puts("NO");
}
return 0;
}