int Grundy(int x)
{
集合S=();
for(i=1;i<=K;i++)
if(a_i<x)
将Grundy(x-a_j)添加到S中
return 不属于S的最小非负整数
}
int N,K,X[maxn],A[maxk];
int Grundy[max_x+1];
void solve()
{
Grundy[0]=0;//轮到自己0枚时则必败
//计算Grundy值
int max_x=*max_element(X,X+N);//需要计算到最大一堆石子数量的Grundy值
//动态规划求Grundy值
for(int j=1;j<=max_x;j++)
{
set<int>s;
for(int i=0;i<K;i++)
{
if(j>=A[i])
s.insert(Grundy[j-A[i]]);
}
int g=0;
while(s.count(g)!=0) g++;
Grundy[j]=g;
}
//判断胜负
int x=0;
for(int i=0;i<N;i++)
x^=Grundy[X[i]];
if(x)
puts("Alice");
else
puts("Bob");
}