题意:普通nim+可以将大于2的一堆石子拆成两堆。
思路:叫做Multi-SG ,也是可以用SG函数去求一下,由于n很大所以我们可以小范围的打个表找个规律
规律就是
SG[i] = i + 1 (i % 4 == 3)
SG[i] = i - 1 (i%4 == 0)
SG[i] = i (i%4 ==2 || i % 4 == 3)
上代码把:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 1<<32-1
int vis[10000],sg[10000];
void init() //打一个SG表
{
sg[0] = 0;
sg[1] = 1;
for(int i = 1 ; i <= 10000 ; i++) //当前范围
{
memset(vis,0,sizeof(vis));
for(int j = 1 ; j <= i ; j++)
{
vis[sg[i - j]] = 1; // 他的下一个范围
}
for(int j = 1 ; j < i ; j ++)
{
vis[sg[j] ^ sg[i-j]] = 1;//一堆石子拆一下~
}
for(int j = 0;;j++)
{
if(!vis[j])
{
sg[i] = j;
break;
}
}
}
}
int f(int x)
{
if(x % 4 == 0) return x-1;
if(x % 4 == 3) return x+1;
return x;
}
int main()
{
int t;
scanf("%d",&t);
//init();
while(t--)
{
int n;
scanf("%d",&n);
int ans = 0 ,te;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&te);
ans ^= f(te);
}
if(ans == 0)
{
puts("Bob");
}
else
{
puts("Alice");
}
}
return 0;
}