1、 总共n张牌;
2、 双方轮流抓牌;
3、 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn =1005;
const int INF =1e9;
int f[12],sg[maxn];
int n;
int getSG(int x)
{
if(sg[x]!=-1)
return sg[x];
int vis[maxn];
memset(vis,0,sizeof vis);
for(int i=0;i<=9;i++)
{
int temp = x - f[i];
if(temp<0)
break;
sg[temp] = getSG(temp);
vis[sg[temp]] = 1;
}
for(int i=0;;i++)
{
if(!vis[i])
{
sg[x] = i;
break;
}
}
return sg[x];
}
int main()
{
for(int i = 0; i<=9; i++)
{
f[i] = pow(2,i);
}
while(scanf("%d",&n) != EOF)
{
memset(sg,-1,sizeof sg);
if(getSG(n)== 0)
cout<<"Cici"<<endl;
else
cout<<"Kiki"<<endl;
}
return 0;
}