ZOJ 3529 A Game Between Alice and Bob(博弈)

来源:互联网 发布:java 敏感词检测 编辑:程序博客网 时间:2024/05/29 02:41

每次可以用一个数的因子来替换这个数,那么可以先分解质因数,找出这个数有几个质因子,用这个数的某个因子来替换它可以等效为拿走这个数的某些质因子。

所以每个数可以变成由它的质因子构成的堆,堆的大小即为质因子的个数,每次的操作是拿走若干个质因子,这就是nim博弈问题了。

先预处理出每个数所对应的质因子的个数,可以在筛素数的时候进行处理。

#include <iostream>#include<cstdio>#include<cstring>using namespace std;int factor[5000005];bool vis[5000005];int solve(int a,int b){    int ret=0;    while(!(a%b)){        ret++;        a/=b;    }    return ret;}void init(){    int i,j;    for(i=2;i<=5000000;i++){        if(!vis[i]) {            for(j=2*i;j<=5000000;j+=i){                vis[j]=1;                factor[j]+=solve(j,i);            }            factor[i]=1;        }    }}int tmp[100005];int main(){    int n,i,sum,ncase=0,j;    init();    while(~scanf("%d",&n)){        sum=0;        for(i=1;i<=n;i++){            scanf("%d",tmp+i);            sum^=factor[tmp[i]];        }        printf("Test #%d: ",++ncase);        if(!sum){            puts("Bob");        }        else{            int ans;            for(i=1;i<=n;i++){                for(j=0;j<factor[tmp[i]];j++){                    if((sum^factor[tmp[i]]^j)==0){                        ans=i;                        goto mark;                    }                }            }            mark: ;            printf("Alice %d\n",ans);        }    }    return 0;}


0 0
原创粉丝点击