1 1 1 1 4 1 0 0 0
Fibo Nacci
对于一个给定的有向无环图,定义关于图的每个顶点的 Sprague-Grundy 函数g如下:g(x)=mex{ g(y) | y是x的后继 },这里的g(x)即sg[x]
例如:取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 1010; 18 int f[maxn] = {1,2},sg[maxn]; 19 bool vis[maxn]; 20 void init(){ 21 int i,j; 22 for(i = 2; f[i-1] <= 1000 && i <= 1000; i++) 23 f[i] = f[i-1]+f[i-2]; 24 memset(sg,0,sizeof(sg)); 25 for(i = 0; i <= 1000; i++){ 26 memset(vis,false,sizeof(vis)); 27 for(j = 0; f[j] <= i; j++) 28 vis[sg[i-f[j]]] = true; 29 for(j = 0; j <= 1000; j++) 30 if(!vis[j]){ 31 sg[i] = j; 32 break; 33 } 34 } 35 } 36 int main() { 37 init(); 38 int a,b,c; 39 while(scanf("%d %d %d",&a,&b,&c),a||b||c){ 40 if(sg[a]^sg[b]^sg[c]) puts("Fibo"); 41 else puts("Nacci"); 42 } 43 return 0; 44 }
BNUOJ 5997 Fibonacci again and again,布布扣,bubuko.com
BNUOJ 5997 Fibonacci again and again
原文:http://www.cnblogs.com/crackpotisback/p/3908524.html