目录:
题目:
分析:
简单的 NIM博弈+SG N I M 博 弈 + S G 函数,当然题目还有个 bug b u g 那就是我们在取出石子时,取出的数量必须与石堆中的石子数互质,所以我们还要用到线性筛选法
代码:
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int t,a,num;
int m,n=read(),v[1000001],sg[1000001],f[1000001];
void prime()//线性筛选
{
for(int i=2;i<=1000000;i++)
{
if(!f[i]) v[++num]=i,sg[i]=num+1;
for(int j=1;j<=num&&(j==1||i%(v[j-1]))&&v[j]*i<=1000000;j++)
f[v[j]*i]=-1,sg[v[j]*i]=j+1;
}
}
int main()
{
sg[1]=1;int a,b;
prime();
for(int i=1;i<=n;i++,b=0)
{
t=read();
for(;t;t--)
{
a=read();
b^=sg[a];//SG函数性质
}
if(b==0) printf("Bob\n");
else printf("Alice\n");
}
return 0;
}