HDU3032 Nim or not Nim?(SG函数)
2016-08-10 16:32
253 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3032
题意:n堆石子,每次可以从任意一堆中取走 若干个或者把一堆石子分成两小堆,拿到最后一个石子的获胜。问先手赢还是后手赢。
思路:标题大坑,按照nim博弈的思路想了好久,最后发现根本不是nim博弈,,,打表跑出前一百个sg值之后发现了规律,如果一堆的石子数x对4取模得0,就亦或x-1;如果x对4取模得3,就亦或x+1;否则亦或x。
AC代码:
题意:n堆石子,每次可以从任意一堆中取走 若干个或者把一堆石子分成两小堆,拿到最后一个石子的获胜。问先手赢还是后手赢。
思路:标题大坑,按照nim博弈的思路想了好久,最后发现根本不是nim博弈,,,打表跑出前一百个sg值之后发现了规律,如果一堆的石子数x对4取模得0,就亦或x-1;如果x对4取模得3,就亦或x+1;否则亦或x。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<set> using namespace std; int main(){ //int sg[1000]; //for (int i = 0; i < 100; i++){ // set<int>s; // for (int j = 0; j < i; j++){ // s.insert(sg[j]); // } // if (i >= 2); // for (int j = 1; j <= i / 2; j++){ // s.insert(sg[j] ^ sg[i - j]); // } // int k = 0; // while (s.count(k))k++; // sg[i] = k; // cout << "i:" << i << " " << "sg[i]:" << sg[i] << endl; //} int t; cin >> t; while (t--){ int n, x, c = 0; scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &x); if (x % 4 == 0)c ^= (x - 1); else if (x % 4 == 3)c ^= (x + 1); else c ^= x; } if (c) puts("Alice"); else puts("Bob"); } return 0; }
相关文章推荐
- SG函数找规律练习-HDU3032- Nim or not Nim?
- SG函数找规律练习-HDU3032- Nim or not Nim?
- hdu3032 Nim or not Nim?(SG函数)
- hdu 3032 Nim or not Nim?(打表 sg函数)
- hdu 3032 Nim or not Nim? (Multi-SG函数)
- HDU3032 Nim or not Nim
- HDU 3032 Nim or not Nim? (sg函数求解)
- HDU 3032 Nim or not Nim? (sg函数求解)
- HDU3032 Nim or not Nim? 博弈
- HDU 3032-Nim or not Nim?(sg函数打表)
- HDU 3032 Nim or not Nim(SG函数打表找规律)
- HDU 3032 Nim or not Nim? (博弈之求SG函数)
- HDU3032-Nim or not Nim?
- HDU 3032 Nim or not Nim? (sg函数求解)
- [HDU3032]Nim or not Nim?(博弈Multi-SG游戏)
- hdu3032 Nim or not Nim?
- HDU 3032 Nim or not Nim? (sg函数) 注意打表方法
- HDU 3032 Nim or not Nim? && HDU 5795 A Simple Nim (Lasker's Nim游戏、SG函数、取走-分割游戏)
- 【HDU3032】【Lasker's Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表
- HDU 3032 Nim or not Nim? (sg函数)