1. 程式人生 > >sg函式和sg定理

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 }