解题思路:
打表,发现是一个带尾巴的循环,找循环节,34;
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 10;
int vis[MAXN];
int SG[MAXN];
int mex(int x)
{
if(SG[x] != -1)
return SG[x];
memset(vis, 0, sizeof(vis));
for(int i=0;i<=x-2;i++)
vis[mex(i) ^ mex(x-2-i)] = 1;
for(int i=0;;i++) if(!vis[i])
{
SG[x] = i;
break;
}
return SG[x];
}
int main()
{
memset(SG, -1, sizeof(SG));
for(int i=0;i<200;i++)
SG[i] = mex(i);
int T;
scanf("%d", &T);
while(T--)
{
int n, x;
scanf("%d", &n);
int ans = 0;
for(int i=0;i<n;i++)
{
int x;
scanf("%d", &x);
if(x < 100) ans ^= (SG[x]);
else
{
x -= 60;
x %= 34;
ans ^= SG[x + 60];
}
}
if(ans) printf("Carol\n");
else printf("Dave\n");
}
return 0;
}