hdu 3032(博弈)
2015-11-11 20:35
295 查看
题意:
有两种操作可选:1.从一堆中拿任意多个(不为0)2.将其中任意一堆分为两堆。不能再操作者输。
sg[0] = 0;
sg[1] = 1;
n = 2, 可分为0, 1, (1, 1)sg[2] = 2;
以此类推,打表观察得 n % 4 == 1 || n % 4 == 2, sg
= n;
n % 4 == 0, sg
= n - 1;
n % 4 == 3, sg
= n + 1;
有两种操作可选:1.从一堆中拿任意多个(不为0)2.将其中任意一堆分为两堆。不能再操作者输。
sg[0] = 0;
sg[1] = 1;
n = 2, 可分为0, 1, (1, 1)sg[2] = 2;
以此类推,打表观察得 n % 4 == 1 || n % 4 == 2, sg
= n;
n % 4 == 0, sg
= n - 1;
n % 4 == 3, sg
= n + 1;
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cmath> #define LL long long #define MAX 0x3f3f3f3f #define N (1000000 + 5) using namespace std; int sg , hash ; // void init() // { // memset(sg, 0, sizeof(sg)); // sg[0] = 0; // sg[1] = 1; // sg[2] = 2; // sg[3] = 4; // for (int i = 4; i < N; i++) // { // memset(hash, 0, sizeof(hash)); // for (int j = 0; j < i; j++) // { // hash[sg[j]] = 1; // } // for (int j = 1; j <= i / 2; j++) // { // int tmp = sg[j] ^ sg[i - j]; // hash[tmp] = 1; // } // for (int j = 0; j < N; j++) // { // if (hash[j] == 0) // { // sg[i] = j; // break; // } // } // } // for (int i = 0; i <= 50; i++) // { // cout << i << ' ' << sg[i] << endl; // } // } int main() { int T; scanf("%d", &T); // init(); while (T--) { int n; scanf("%d", &n); int t, ans = 0; for (int i = 1; i <= n; i++) { scanf("%d", &t); if (t % 4 == 0) { ans = (ans ^ (t - 1)); } else if (t % 4 == 3) { ans = (ans ^ (t + 1)); } else { ans = (ans ^ t); } } if (ans != 0) { cout << "Alice" << endl; } else { cout << "Bob" << endl; } } }
相关文章推荐
- [FAFU 1292]博弈论,组合游戏,取石游戏
- Sicily 1305 Who’s Winner?
- Andrew Stankevich Contest 38 , J-Jackpot
- 纸牌博弈问题
- uva 12293 Box Game
- hdu 1846 (博弈)
- HDU 1849(尼姆博弈)
- hdu 1847(博弈)
- hdu 1850(妮姆博奕)
- HDU 1079 Calendar Game
- cf 276b 博弈
- SG-分石子游戏
- 博弈-取石子
- 博弈-威佐夫博弈
- 博弈-巴什博弈
- 博弈-Nim博弈
- 编程之美1.13 威佐夫博奕拓展的分析与论证
- 编程之美1.13 威佐夫(NIM)博奕(Wythoff Game)涉及的数学定理论证
- 取石子游戏-博弈
- 取石子游戏