【LOJ】#2067. 「SDOI2016」硬币游戏
2018-08-23 14:14
330 查看
题解
c一样的就是一个独立的游戏
我们对于2和3的指数
sg[i][j] 表示\(c \cdot 2^i \cdot 3^j\)的棋子,只有这个硬币是反面,翻转的硬币是正面的sg值
枚举sg函数所有可能的局面,每个后继局面的sg值,就是所有被翻到背面的硬币sg值的异或和
我们忽略了反转当前硬币前面可能不是全部正面,但是这是正确的,我们可以证明一下
如果一个局面所有背面朝上的棋子sg函数异或起来为\(x\)
若\(x!=0\)
那么我们找到\(x\)最高位是\(2^k\),我们找到一个含有\(2^k\)的硬币\(a_n\),\(x^a_n < a_n\) 我们选择这个棋子的后继局面中等于\(x^a_n\)的那个即可将局面的sg异或值变成0
若\(x = 0\)
如果一个局面行动后的后继局面中有0,那么这个局面的值一定不为0
所有可操作的局面sg的值都不为0,且后继局面中的值与该局面sg值不等
故而无论如何操作,sg值为正
代码
#include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define pii pair<int,int> #define fi first #define se second #define mp make_pair #define MAXN 1000005 #define mo 999999137 #define pb push_back //#define ivorysi using namespace std; typedef long long int64; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 + c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) out(x / 10); putchar('0' + x % 10); } int sg[55][55]; bool f[60005]; int N,MAXQ,a[30005]; void Init() { memset(sg,0,sizeof(sg)); sg[0][0] = 0; for(int i = 0 ; i <= 50 ; ++i) { for(int j = 0 ; j <= 50 ; ++j) { if(i == 0 && j == 0) continue; memset(f,0,sizeof(f)); if(i != 0) { for(int p = 1 ; p <= i ; ++p) { int t = 0; for(int q = 1 ; q <= min(MAXQ,i / p) ; ++q) { t ^= sg[i - p * q][j]; f[t] = 1; } } } if(j != 0) { for(int p = 1 ; p <= j ; ++p) { int t = 0; for(int q = 1 ; q <= min(MAXQ,j / p) ; ++q) { t ^= sg[i][j - p * q]; f[t] = 1; } } } int p = 0; while(f[p]) ++p; sg[i][j] = p; } } } void Solve() { read(N);read(MAXQ); Init(); int ans = 0; for(int i = 1 ; i <= N ; ++i) { read(a[i]); if(!a[i]) { int t = i,c2 = 0,c3 = 0; while(t % 2 == 0) t /= 2,++c2; while(t % 3 == 0) t /= 3,++c3; ans ^= sg[c2][c3]; } } if(!ans) puts("lose"); else puts("win"); } int main() { int T; read(T); while(T--) { Solve(); } return 0; }
相关文章推荐
- [SDOI2016]硬币游戏
- 【LOJ】#2032. 「SDOI2016」游戏
- [Sdoi2016]硬币游戏
- 分治法-找硬币的游戏
- [Sdoi 2017] bzoj4820 硬币游戏 [概率+高斯消元+哈希]
- 【LOJ】#2562. 「SDOI2018」战略游戏
- 【LOJ】#2035. 「SDOI2016」征途
- 4600: [Sdoi2016]硬币游戏
- NKOJ 4087 (SDOI 2017)硬币游戏(高斯消元)
- 51nod 1381 硬币游戏
- hdoj 1847 (同硬币游戏1)
- 【bzoj2017】[Usaco2009 Nov]硬币游戏
- 51Nod 1381 硬币游戏
- bzoj 1411: [ZJOI2009]硬币游戏 找规律
- 【bzoj 2017】硬币游戏
- 硬币游戏1
- 【51nod】---硬币游戏(思维&&数学)
- 51Nod 1381 硬币游戏 | 概率(数学期望)
- bzoj4515 [Sdoi2016]游戏 标记永久线段树+链剖+差分
- BZOJ 2017 [Usaco2009 Nov]硬币游戏