题目链接:点击查看
题意:给出n个数,每轮可以把某个数变成他的因子,先手获胜输出Alice 和 他第一次可以操作的最靠前的数字
题解:把这个数变成他的因子,这不就相当于,除掉了几个质因数吗,这不就是取掉几个石子吗,这不就是尼姆博弈吗,为啥当时脑子瓦特了。。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ok[5000100],prime[500010],len;
int n,a[100010];
void init()
{
for(int i=2;i<=5000000;i++)
{
if(!ok[i]) prime[len++]=i;
for(int j=0;j<len&&(ll)prime[j]*i<=5000000;j++)
{
ok[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int cul(int x)
{
int res=0;
for(int i=0;i<len&&(ll)prime[i]*prime[i]<=x;i++)
{
while(x%prime[i]==0)
{
x/=prime[i];
res++;
}
}
if(x>1) res++;
return res;
}
int main()
{
init();
int nn=1;
while(~scanf("%d",&n))
{
int ans=0,x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[i]=cul(x);
ans^=a[i];
}
printf("Test #%d: ",nn++);
if(!ans) printf("Bob\n");
else
{
int cnt;
for(int i=1;i<=n;i++)
{
cnt=ans^a[i];
if(a[i]>=cnt)
{
printf("Alice %d\n",i);
break;
}
}
}
}
return 0;
}