题意:3堆石子,数量分别为n,m,p,两个人轮流选一堆取f个,f只能是Fibonacci数列中的数,问先手胜负。
// HDU-1848 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 1e3+10; int f[17], sg[N], hashn[21]; int n, m, p; void Getsg() { int i, j; sg[0]=0, sg[1]=1; F(i,2,N) { mes(hashn, 0); for(j=1; f[j]<=i; j++) hashn[sg[i-f[j]]]=1; FF(j,0,20) if(hashn[j]==0) { //求未出现过的最小非负整数 sg[i]=j; break; } } } int main() { f[0]=f[1]=1; F(i,2,17) f[i]=f[i-1]+f[i-2]; Getsg(); while(scanf("%d%d%d", &n, &m, &p) && n&&m&&p) { if(sg[n]^sg[m]^sg[p]) puts("Fibo"); else puts("Nacci"); } return 0; }