类似多对石头的博弈
判断哪个先取时,再第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);
}
}