题目请点我
题解:
SG裸题,这道题用dp先打表预处理就会比较方便。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set>
#define MAX 1024
using namespace std;
int N;
int A[10];
int grundy[MAX];
void pre();
int main()
{
pre();
while( scanf("%d",&N) != EOF ){
if( grundy[N] ){
printf("Kiki\n");
}
else{
printf("Cici\n");
}
}
return 0;
}
void pre(){
int tmp = 1;
for( int i = 0; i < 10; i++ ){
A[i] = tmp;
tmp *= 2;
}
memset(grundy,-1,sizeof(grundy));
grundy[0] = 0;
for( int j = 1; j < MAX; j++ ){
set<int> s;
for( int i = 0; i < 10; i++ ){
if( A[i] <= j ){
s.insert(grundy[j-A[i]]);
}
}
int g = 0;
while( s.count(g) != 0 ){
g++;
}
grundy[j] = g;
}
return ;
}