题意:
有两种操作可选:1.从一堆中拿任意多个(不为0)2.将其中任意一堆分为两堆。不能再操作者输。
sg[0] = 0;
sg[1] = 1;
n = 2, 可分为0, 1, (1, 1)sg[2] = 2;
以此类推,打表观察得 n % 4 == 1 || n % 4 == 2, sg[n] = n;
n % 4 == 0, sg[n] = n - 1;
n % 4 == 3, sg[n] = n + 1;
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define LL long long
#define MAX 0x3f3f3f3f
#define N (1000000 + 5)
using namespace std;
int sg[N], hash[N];
// void init()
// {
// memset(sg, 0, sizeof(sg));
// sg[0] = 0;
// sg[1] = 1;
// sg[2] = 2;
// sg[3] = 4;
// for (int i = 4; i < N; i++)
// {
// memset(hash, 0, sizeof(hash));
// for (int j = 0; j < i; j++)
// {
// hash[sg[j]] = 1;
// }
// for (int j = 1; j <= i / 2; j++)
// {
// int tmp = sg[j] ^ sg[i - j];
// hash[tmp] = 1;
// }
// for (int j = 0; j < N; j++)
// {
// if (hash[j] == 0)
// {
// sg[i] = j;
// break;
// }
// }
// }
// for (int i = 0; i <= 50; i++)
// {
// cout << i << ' ' << sg[i] << endl;
// }
// }
int main()
{
int T;
scanf("%d", &T);
// init();
while (T--)
{
int n;
scanf("%d", &n);
int t, ans = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &t);
if (t % 4 == 0)
{
ans = (ans ^ (t - 1));
}
else if (t % 4 == 3)
{
ans = (ans ^ (t + 1));
}
else
{
ans = (ans ^ t);
}
}
if (ans != 0)
{
cout << "Alice" << endl;
}
else
{
cout << "Bob" << endl;
}
}
}