Hdu
你有三堆石子,每堆石子的个数是\(n,m,p\),你每次能够从一堆石子中取走斐波那契数列中一个元素等数量的石子数,两人轮流取,不能操做者输,断定前后手的胜利。php
根据\(SG\)定理,三堆石子能够拆开来看,最终状态的\(SG\)函数为这三堆石子\(SG\)函数的异或值。
那么,咱们只须要预处理任意数量石子的\(SG\)值就行了。
对于一堆数量为\(x\)的石子的\(SG\)函数为:
\[SG(x)=mex\{SG(x-y),y\in Fib,x\ge y\}\]
直接预处理便可。ios
#include<iostream> using namespace std; int fib[20],n,m,p,SG[1010]; bool vis[1010]; int main() { ios::sync_with_stdio(false); fib[1]=fib[2]=1;SG[0]=0; for(int i=3;i<=17;++i)fib[i]=fib[i-1]+fib[i-2]; for(int i=1;i<=1000;++i) { for(int j=1;fib[j]<=i;++j)vis[SG[i-fib[j]]]=true; for(int j=0;;++j)if(!vis[j]){SG[i]=j;break;} for(int j=1;fib[j]<=i;++j)vis[SG[i-fib[j]]]=false; } while(233) { cin>>n>>m>>p;if(!n&&!m&&!p)break; if(SG[n]^SG[m]^SG[p])cout<<"Fibo"<<endl; else cout<<"Nacci"<<endl; } return 0; }