#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int sg[202];//sg[i]表示连续的x个空格子组成的棋盘的SG值
int vis[202];
void init()//SG定理
{
int i,j,k;
sg[1]=0;
sg[2]=1;
for(i=3;i<=200;i++)
{
memset(vis,0,sizeof(vis));
for(j=(i+1)/2;j<i;j++)
vis[sg[j]]=1;
for(j=0;j<=200;j++)
if(!vis[j])
{
sg[i]=j;
break;
}
}
for(i=1;i<=50;i++)
cout<<i<<":"<<sg[i]<<endl;
//输出前50个数的SG值,可发现,只有当n=2^i-1是,SG函数值是0,即必败
}
int main()
{
//init();
int n;
while(cin>>n)
{
if(n==0)
break;
n++;
while(n!=1)
{
if(n%2==0)
n=n/2;
else
break;
}
if(n==1)
cout<<"Bob"<<endl;
else
cout<<"Alice"<<endl;
}
return 0;
}
/*
题意:有两个盒子,一个n,另一个1,Alice(先)和Bob轮流,每次删去较小值,并分较大值为两个正整数放入两个盒子,不能分者为负。
方法:由于n太大,不能直接用SG定理,可用SG定理输出SG函数,查看规律。
SG状态:每次只删去较小值。所以可以认为从n开始,每次n都变为(n+1)/2~n-1中的一个,即较小值会被删去,
所以只用讨论n逐次分出的较大值,直到较大值为1时。
*/
UVA 12293 Box Game 组合游戏/SG定理+找规律
最新推荐文章于 2021-04-16 09:04:38 发布