雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

尼姆博弈——ZOJ Problem Set - 3529

Posted on 2011-09-17 21:05  huhuuu  阅读(360)  评论(0编辑  收藏  举报
类似多对石头的博弈
判断哪个先取时,再第i个数与总的S取异或,如果a[i]>=(s^a[i])就是先取它
View Code
#include<iostream>
#include
<stdio.h>
#include
<algorithm>
#include
<stdlib.h>
#include
<string.h>
#include
<math.h>
using namespace std;

int a[1000009];
int b[1000009];
int prim[100009];
int padd=0;


int pp(int a)
{
int i,t;
t
=(int)sqrt((double)a);
for(i=2;i<=t;i++)
{
if(a%i==0)
break;
}
if(i==(t+1))
return 1;
else
return 0;
}

int ppp(int a)
{
int i,t;
t
=(int)sqrt((double)a);

for(i=0;prim[i]<=t;i++)
{
if((a%prim[i])==0)
return 0;
}
return 1;
}

int f(int temp)
{
int i,add=0;
int s=(int)sqrt((double)temp);

while(ppp(temp)==0)
{
for(i=0;i<padd;i++)
{
if((temp%prim[i])==0)
{
add
++;
temp
=temp/prim[i];
break;
}
}
}
return add+1;
}

int main()
{
int n,T=0;
while(scanf("%d",&n)!=EOF)
{
T
++;
printf(
"Test #%d: ",T);
int i,j;
padd
=0;
for(i=2;i<=2500;i++)
{
if(pp(i)==1)
{
prim[padd]
=i;
padd
++;
}
}

for(i=0;i<n;i++)
{
scanf(
"%d",&a[i]);
if(a[i]==1)
b[i]
=0;
else
b[i]
=f(a[i]);
}

int s=0;
for(i=0;i<n;i++)
{
s
=s^b[i];
}

if(s==0)
{
printf(
"Bob\n");
continue;
}
printf(
"Alice ");

int ri,min=999999999;
for(i=0;i<n;i++)
{
if(b[i]>=(s^b[i]))
{
if(min>a[i])
{
min
=a[i];
ri
=i;
break;
}
}
}
printf(
"%d\n",ri+1);
}
}