zoj 3529 博弈SG

来源:互联网 发布:python安卓开发 编辑:程序博客网 时间:2024/05/16 10:05

当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 50000int 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;}

原创粉丝点击