HDU1848 Fibonacci again and again (SG函数)
作者:互联网
题目链接在这里:Problem - 1848 (hdu.edu.cn)
首先要理解sg函数的作用,sg函数就是将一个ICG博弈问题转化为Nim博弈的东西,因此在一个ICG博弈中,构造出sg函数就非常重要。sg函数也可以用树形结构来表示,这里可以看算法讲堂里面说的,对于本题来说构造的过程也就是,第i个节点是第i-fib[j]节点的父亲,fib中存的是Fibonacci数列。
这题算是很基础的sg函数模型,只要知道树形结构怎么构造就行了。
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int MAX=1005; 4 int fib[MAX]; 5 int sg[MAX]; 6 bool flag[MAX]; 7 void getsg(){ 8 int i,j; 9 memset(sg,0,sizeof(sg)); 10 for (i=1;i<=1001;i++){ 11 memset(flag,false,sizeof(flag)); 12 for (j=1;j<=20 && fib[j]<=i;j++) 13 flag[sg[i-fib[j]]]=true; 14 for (j=0;j<=i;j++) 15 if (!flag[j]){ 16 sg[i]=j; 17 break; 18 } 19 } 20 } 21 int main(){ 22 int i,j,a,b,c; 23 fib[1]=1,fib[2]=2; 24 for (i=3;i<=20;i++) 25 fib[i]=fib[i-1]+fib[i-2]; 26 getsg(); 27 while (scanf("%d%d%d",&a,&b,&c),!(a==0 && b==0 && c==0)){ 28 if (sg[a]^sg[b]^sg[c]) 29 printf("Fibo\n"); 30 else printf("Nacci\n"); 31 } 32 return 0; 33 }
标签:again,HDU1848,int,MAX,fib,SG,sg,函数 来源: https://www.cnblogs.com/keximeiruguo/p/16690439.html