HDU 1848 Fibonacci again and again(SG函数)
模版题,写错了,wa好几次。。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 #define LL __int64 6 int dp[1001]; 7 int fib[21]; 8 int sg(int x) 9 { 10 int flag[101],temp,i; 11 if(dp[x] >= 0) 12 return dp[x]; 13 memset(flag,0,sizeof(flag)); 14 for(i = 1;i <= 15&&x >= fib[i];i ++) 15 { 16 if(dp[x-fib[i]] == -1) 17 temp = sg(x-fib[i]); 18 else 19 temp = dp[x-fib[i]]; 20 flag[temp] = 1; 21 } 22 for(i = 0;;i ++) 23 if(!flag[i]) 24 return dp[x] = i; 25 } 26 int main() 27 { 28 int n,m,p,ans,i; 29 fib[1] = 1; 30 fib[2] = 2; 31 for(i = 3;i <= 15;i ++) 32 { 33 fib[i] = fib[i-1] + fib[i-2]; 34 } 35 while(scanf("%d%d%d",&n,&m,&p)!=EOF) 36 { 37 if(!n&&!m&&!p) break; 38 memset(dp,-1,sizeof(dp)); 39 dp[0] = 0; 40 ans = 0; 41 ans ^= sg(n); 42 ans ^= sg(m); 43 ans ^= sg(p); 44 if(ans) 45 printf("Fibo\n"); 46 else 47 printf("Nacci\n"); 48 } 49 return 0; 50 }