法一:
首先我们能够想到在面对3的时候是必败局,谁面对3时不管拿多少都会败 ! <---这是关键
那么就要尽量造成这种局势给对方。由于不论什么不是3的倍数的数加1或2都能够变成3的倍数。
同理减去1或2也能够变成3的倍数,也就是说如果眼下的个数不是3的倍数,那我肯定能把它
拿成3的倍数,比方如今是11个,那我拿走2个就变成9,这样就造成对方为3的倍数局势,那
么对方拿m个我都能够通过拿1或者2使总共一轮拿的数目成为3的倍数
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n%3==0)
printf("Cici
");
else
printf("Kiki
");
}
return 0;
}
法二:
sg函数:
照着模板敲得说实话,没明确sg函数究竟怎么回事,为什么能够这样用
sg[n]=0,后者赢。
路过的谁懂,希望解释一下
代码例如以下:
#include<stdio.h>
#include<string.h>
#define Maxn 1100
int sg[Maxn],ba[Maxn],cnt,n,temp[Maxn];
void init()
{
int i,j;
ba[0]=1;
for( i=1;i<=9;i++) //打出1000内的2次幂数
ba[i]=ba[i-1]*2;
cnt=9;
memset(sg,-1,sizeof(sg));
sg[0]=0;
for(i=1;i<=1000;i++) //求出全部状态的sg值
{
memset(temp,-1,sizeof(temp));
for( j=0;j<=cnt&&ba[j]<=i;j++)
temp[sg[i-ba[j]]]=0;
for( j=0;;j++)
if(temp[j]==-1) //第一个没出现的数
{
sg[i]=j;
break;
}
}
}
int main()
{
init();
while(~scanf("%d",&n))
{
if(sg[n]) //先赢
printf("Kiki
");
else
printf("Cici
");
}
return 0;
}
那么就要尽量造成这种局势给对方。由于不论什么不是3的倍数的数加1或2都能够变成3的倍数。
拿成3的倍数,比方如今是11个,那我拿走2个就变成9,这样就造成对方为3的倍数局势,那
么对方拿m个我都能够通过拿1或者2使总共一轮拿的数目成为3的倍数
#include<stdio.h> int main() { int n; while(~scanf("%d",&n)) { if(n%3==0) printf("Cici "); else printf("Kiki "); } return 0; }
法二:
#include<stdio.h> #include<string.h> #define Maxn 1100 int sg[Maxn],ba[Maxn],cnt,n,temp[Maxn]; void init() { int i,j; ba[0]=1; for( i=1;i<=9;i++) //打出1000内的2次幂数 ba[i]=ba[i-1]*2; cnt=9; memset(sg,-1,sizeof(sg)); sg[0]=0; for(i=1;i<=1000;i++) //求出全部状态的sg值 { memset(temp,-1,sizeof(temp)); for( j=0;j<=cnt&&ba[j]<=i;j++) temp[sg[i-ba[j]]]=0; for( j=0;;j++) if(temp[j]==-1) //第一个没出现的数 { sg[i]=j; break; } } } int main() { init(); while(~scanf("%d",&n)) { if(sg[n]) //先赢 printf("Kiki "); else printf("Cici "); } return 0; }