其实这题看懂了就很好搞了。
每次加边,不能形成三角形,所以肯定不加共点的边,否则就是自杀。
x个点,转移后相当于 i , x-i-2 .加的那两个点去掉了。
SG函数打表以后,很明显是要找规律。
发现周期是34.
而且周期要到后面才有周期。
所以前面打表,后面利用周期。
可以参考下oeis,发现这个是经典的问题。Sprague-Grundy values for Dawson's Chess
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define clr(a, x) memset(a, x, sizeof(a))
const int MAXN = 100010;
int sg[121];
bool vis[121];
int mex(int x)
{
if(sg[x]!=-1)return sg[x];
if(x == 0||x == 1)return sg[x] = 0;
if(x == 2||x == 3)return sg[x] = 1;
clr(vis,0);
for(int i = 0;i < x-1;i++)
vis[mex(i)^mex(x-i-2)] = 1;
for(int i = 0;;i++)
if(!vis[i]) return sg[x] = i;
}
int SG(int x)
{
if(x <= 120) return sg[x];
x=x%34+2*34;
return sg[x];
}
int main()
{
clr(sg,-1);
for(int i = 0;i <= 120;i++)
sg[i] = mex(i);
int T,n,a;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int sum = 0;
for(int i = 0;i < n;i++)
scanf("%d",&a),sum ^= SG(a);
if(sum) puts("Carol");
else puts("Dave");
}
return 0;
}