标签:
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
Sample Output
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 1005; const int M = 25; int fib[25]; int SG[N]; int mex(int x) { bool vis[M]; memset(vis,0,sizeof(vis)); for(int i=0;i<M;i++) { int t = x - fib[i]; if(t < 0) break; if(SG[t] == -1) SG[t] = mex(t); vis[SG[t]] = 1; } for(int i=0;;i++) if(!vis[i]) return i; } void Init() { fib[0] = 1; fib[1] = 2; for(int i=2;i<M;i++) fib[i] = fib[i-1] + fib[i-2]; memset(SG,-1,sizeof(SG)); for(int i=0;i<N;i++) SG[i] = mex(i); } int main() { Init(); int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)) { if(a == 0 && b == 0 && c == 0) break; int ans = 0; ans ^= SG[a]; ans ^= SG[b]; ans ^= SG[c]; if(ans) puts("Fibo"); else puts("Nacci"); } return 0; }
非深搜:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 1005; const int M = 25; int fib[25]; int SG[N]; void get() { bool vis[M]; for(int i=0;i<N;i++) //sg数组 { memset(vis,0,sizeof(vis)); for(int j=0;j<M&&fib[j]<=i;j++) //要用的s数组 注意这里有等号 { vis[SG[i-fib[j]]]=1; } for(int x=0;x<N;x++) if(!vis[x]) { SG[i]=x; break; } } } void Init() { fib[0] = 1; fib[1] = 2; for(int i=2;i<M;i++) fib[i] = fib[i-1] + fib[i-2]; memset(SG,0,sizeof(SG)); //这里定义成 -1和0都可以 get(); } int main() { Init(); int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)) { if(a == 0 && b == 0 && c == 0) break; int ans = 0; ans ^= SG[a]; ans ^= SG[b]; ans ^= SG[c]; if(ans) puts("Fibo"); else puts("Nacci"); } return 0; }
HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)
标签:
原文地址:http://www.cnblogs.com/Ritchie/p/5628002.html