HDU 1848 Fibonacci again and again(SG函数)
2015-08-17 20:32
501 查看
题意:有三堆石子,两人轮流取,每次只能取斐波那契数列个石子,求胜方。
简单的SG函数求解,设一堆石子有x个,并定义为局面x,那么局面x的后继局面y为 x-F[i](i=1,2,...),其中F[i]表示斐波那契数列。
然后求解SG函数就成了。
最后SG(tol)=SG(n) xor SG(m) xor SG(p) 其中tol表示整个三堆石子m,n,p的局面。
简单的SG函数求解,设一堆石子有x个,并定义为局面x,那么局面x的后继局面y为 x-F[i](i=1,2,...),其中F[i]表示斐波那契数列。
然后求解SG函数就成了。
最后SG(tol)=SG(n) xor SG(m) xor SG(p) 其中tol表示整个三堆石子m,n,p的局面。
#pragma warning(disable:4996) #include <cstdio> #include <cstring> using namespace std; const int N = 1000; int sg[N + 1], f[16]; bool vis ; void getF(){ f[1] = 1; f[2] = 2; for (int i = 3; i < 16; i++) f[i] = f[i - 1] + f[i - 2]; } void getSG(){ sg[0] = 0; for (int i = 1; i <= N; i++){ memset(vis, false, sizeof vis); for (int j = 1; j < 16; j++){ int t = f[j]; if (t>i)break; vis[sg[i - t]] = true;//注意这里是对相应的SG标记 } for (int j = 0; j <= N; j++){ if (!vis[j]){ sg[i] = j; break; } } } } int main(){ getF(); getSG(); int n, m, p; while (scanf("%d %d %d", &n, &m, &p)){ if (n == 0 && m == 0 && p == 0)break; int ans = sg ^ sg[m] ^ sg[p]; if (ans == 0)printf("Nacci\n"); else printf("Fibo\n"); } return 0; }
相关文章推荐
- underscore chain
- Slave failed to initialize relay log info structure from the repository
- 游戏人工智能 状态驱动智能体设计——消息功能
- hdu 5381 The sum of gcd 原来有个算法叫莫队 2015 Multi-University Training Contest 8
- 1079. Total Sales of Supply Chain (25)
- PAT 1086. Tree Traversals Again (25)
- Hive的Explain命令
- How To run OAI eNB (No S1) with USRP X310(1)
- pywin32 ImportError: DLL load failed: 找不到指定的模块
- 关于百度地图开发中可能遇到Conversion to Dalvik format failed with error 1
- 2015 Multi-University Training Contest 8 hdu 5381 The sum of gcd
- atomic和nonatomic assign retain
- HDOJ 4460 Friend Chains 图的最长路
- 2015 Multi-University Training Contest 8(HDOJ5384、5389)
- 2015 Multi-University Training Contest 8
- Testng 运行报错:"Total tests run: 0, Failures: 0, Skips: 0"以及找不到class文件的问题
- [观察]HDOJ1021Fibonacci Again
- 2015 HUAS Summer Trainning #6~G
- 关于hp proliant sl210t服务器raid 1阵列配置
- Agent admitted failure to sign using the key