sg函数和sg定理
https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html
https://blog.csdn.net/kamisama123/article/details/77649118
下面这篇解释得很清楚。
单个游戏:
sg(0)=0 //sg值为0的有且只有必败态
sg(x) = mex(sg(y)) x的所有后继状态中 第一个不能达到的sg值,则x可到达sg为0~sg(x)-1的状态
组合游戏:
可将sg值看作为石子数,则转化为nim取石子游戏,总游戏的胜负由sg的异或和决定。
hdu1848
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int N=1100; 8 int sg[N],bit[20]; 9 bool vis[N]; 10 11 int main() 12 { 13 bit[1]=1;bit[2]=2; 14 for(int i=3;i<=16;i++) bit[i]=bit[i-1]+bit[i-2]; 15 sg[0]=0; 16 for(int i=1;i<=1000;i++) 17 { 18 memset(vis,0,sizeof(vis)); 19 for(int j=1;j<=16;j++) 20 { 21 if(i>=bit[j]) vis[sg[i-bit[j]]]=1; 22 else break; 23 } 24 for(int j=0;j<=1000;j++) 25 if(!vis[j]) {sg[i]=j;break;} 26 } 27 int x,y,z; 28 while(1) 29 { 30 scanf("%d%d%d",&x,&y,&z); 31 if(!x && !y && !z) return 0; 32 if(sg[x]^sg[y]^sg[z]) printf("Fibo\n"); 33 else printf("Nacci\n"); 34 } 35 return 0; 36 }