您的位置:首页 > 其它

zoj 3529 博弈SG

2013-07-13 21:17 477 查看
当NIM和X>0,此时必胜状态

使X的最左边的1存在的一堆石头,设为Y,操作它,就能必胜

因为

令Z=X ^ Y,消去最左边的1,则Z<Y,且Z ^ X ^ Y=0,说明此时为必败状态

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 100005
#define MAXN 50000

int a[N+100],b[N+100],n;
int prime[MAXN+4],cnt,isprime[MAXN+5];
int cal(int obj)
{
int res=0;
for(int i=0;prime[i]*prime[i]<=obj;++i)
if(obj%prime[i]==0)
{
while(obj%prime[i]==0)
{
obj/=prime[i];
res++;
}
}
if(obj>1)
res++;
return res;
}
int main ()
{
for(int i=2;i<MAXN;++i)
if(!isprime[i])
{
prime[cnt++]=i;
for(int j=i;j<MAXN;j+=i)
isprime[j]=1;
}
int ncase=0;
while(scanf("%d",&n)!=EOF)
{
int ans=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
b[i]=cal(a[i]);
ans^=b[i];
}
if(ans)
{
int first=-1,y;
for(int i=1;i<=n;++i)
{
if(b[i]> (ans^b[i]))
{
first=i;
break;
}
}
printf("Test #%d: Alice %d\n",++ncase,first);
}
else printf("Test #%d: Bob\n",++ncase);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: