sg函数打表
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 55
int f[N],sg[N],hash[N];
void getSG1(int n) //第一堆每次只能取2的幂次(即:1,2,4,8,16…);
{ f[1]=1;
for(int i=2;i<=10;i++)
f[i]=f[i-1]*2;
int i,j;
memset(sg,0,sizeof(sg));
for(i=1;i<=n;i++)
{
memset(hash,0,sizeof(hash));
for(j=1;f[j]<=i;j++)
hash[sg[i-f[j]]]=1;
for(j=0;j<=n;j++) //求mes{}中未出现的最小的非负整数
{
if(hash[j]==0)
{
sg[i]=j;
break;
}
}
}
}
int main(){
getSG1(55);
for(int i=1;i<=55;i++){
printf("i=%d sg=%d\n",i,sg[i]);
}
return 0;
}
巴什博弈!此题中, 3 的倍数时先手必败!
理由如下:
若总数为 3 的倍数,后手保证所拿数量与先手之和为3的倍数则必赢!!
若总数非3的倍数,先手拿除于3的余数,以后先手所拿数量与后手所拿之和为 3 的倍数,则先手必赢!!
#include<stdio.h>
using namespace std;
int main(){
int m;
while(scanf("%d",&m)!=EOF){
if(m%3!=0)
printf("Kiki\n");
else printf("Cici\n");
}
return 0;
}