【博弈论】【SG函数】hdu1848 Fibonacci again and again
某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数。
有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态。
不论SG值增加与否,我们都可以将当前所有子游戏的SG值异或起来从而判断胜负状态。
常采用记忆化搜索来计算SG函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include<cstdio> #include<set> #include<cstring> using namespace std; int fib[1001],a[3],SG[1001],m; int sg( int x) { if (SG[x]!=-1) return SG[x]; set< int >S; for ( int i=1;i<=m;++i) { if (fib[i]>x) break ; S.insert(sg(x-fib[i])); } for ( int i=0;;++i) if (S.find(i)==S.end()) return SG[x]=i; } int main() { fib[1]=fib[2]=1; for (m=2;fib[m+1]<=1000;++m) fib[m+1]=fib[m]+fib[m-1]; memset (SG,-1, sizeof (SG)); while (1) { scanf ( "%d%d%d" ,&a[0],&a[1],&a[2]); if ((!a[0])&&(!a[1])&&(!a[2])) break ; puts ((sg(a[0])^sg(a[1])^sg(a[2]))? "Fibo" : "Nacci" ); } return 0; } |
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步