http://acm.hdu.edu.cn/showproblem.php?pid=1847
和toj1180完全一样的题。
用sg函数写一下。将1000内的sg值打表即可。
code:
/*
#include<cstdio>
int main(){
int n ;
while(~scanf("%d", &n)){
if(n%3) printf("Kiki\n") ;
else printf("Cici\n") ;
}
return 0 ;
} */
#include<cstdio>
#include<cstring>
int sg[ 1001], a[ 11] ;
void init(){
memset(sg, - 1, sizeof(sg)) ;
sg[ 0] = 0, sg[ 1] = 1 ;
a[ 0] = 1 ;
for( int i= 1; i< 10; i++){
a[i] = a[i- 1] * 2 ;
sg[a[i]] = 1 ; // 可以一步胜的点sg为1
}
}
int mex( int n){ // sg[n]=mex(sg[m]), m为n后继
if(sg[n]!=- 1) return sg[n] ;
for( int i= 0; i< 10; i++){
int temp = n - a[i] ;
if(temp< 0) break ;
if(sg[temp]== 0||sg[temp]==- 1&&!mex(temp)){
// n可以一步到sg为0的点
sg[n] = 1 ;
return 1 ;
}
}
sg[n] = 0 ;
return 0 ;
}
int main(){
int n ;
init() ;
mex( 1000) ; // 求sg值
while(~scanf( " %d ", &n)){
if(sg[n]) printf( " Kiki\n ") ;
else printf( " Cici\n ") ;
}}
int main(){
int n ;
while(~scanf("%d", &n)){
if(n%3) printf("Kiki\n") ;
else printf("Cici\n") ;
}
return 0 ;
} */
#include<cstdio>
#include<cstring>
int sg[ 1001], a[ 11] ;
void init(){
memset(sg, - 1, sizeof(sg)) ;
sg[ 0] = 0, sg[ 1] = 1 ;
a[ 0] = 1 ;
for( int i= 1; i< 10; i++){
a[i] = a[i- 1] * 2 ;
sg[a[i]] = 1 ; // 可以一步胜的点sg为1
}
}
int mex( int n){ // sg[n]=mex(sg[m]), m为n后继
if(sg[n]!=- 1) return sg[n] ;
for( int i= 0; i< 10; i++){
int temp = n - a[i] ;
if(temp< 0) break ;
if(sg[temp]== 0||sg[temp]==- 1&&!mex(temp)){
// n可以一步到sg为0的点
sg[n] = 1 ;
return 1 ;
}
}
sg[n] = 0 ;
return 0 ;
}
int main(){
int n ;
init() ;
mex( 1000) ; // 求sg值
while(~scanf( " %d ", &n)){
if(sg[n]) printf( " Kiki\n ") ;
else printf( " Cici\n ") ;
}}