翻硬币游戏,任意选3个,最右边的一个必须是正面。不能操作者败。
基本模型..不太可能自己推 还是老实记下来吧..对于单个硬币的SG值为2x或2x+1,当该硬币的位置x,其二进制1的个数为偶数时,sg=2x+1否则为2x
/** @Date : 2017-10-14 23:13:21 * @FileName: HDU 3537 基础翻硬币模型 向NIM转化.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair<int ,int> #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; int main() { int n; while(cin >> n) { int sg = 0; map<int, int>q; for(int i = 0; i < n; i++) { int x; scanf("%d", &x); if(q[x] == 1) continue; q[x] = 1; int cnt = 0; int t = 2 * x; while(x) { if(x & 1) cnt++; x >>= 1; } if(cnt % 2 == 0) t++; sg ^= t; cout << sg << endl; } printf("%s ", sg?"No":"Yes"); } return 0; }