杭电 1847

来源:互联网 发布:正大数据恢复中心 深圳 编辑:程序博客网 时间:2024/05/23 22:16

题意:

1、  总共n张牌;
2、  双方轮流抓牌;
3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢?

思路:求SG值

 

代码:

#include<stdio.h>#include<string.h>int sg[1001];int mex(int n)//求sg值{int a[11]={0};int i=1;while(i<=n){if(sg[n-i]==-1)sg[n-i]=mex(n-i);a[ sg[n-i] ]=1;i=i*2;}for(i=0;i<11;i++)if(a[i]==0)return i;}int main(){int n;memset(sg,-1,sizeof(sg));sg[0]=0;for(n=0;n<1001;n++)mex(n);while(scanf("%d",&n)!=EOF){if(sg[n]){printf("Kiki\n");}else{printf("Cici\n");}}return 0;}