bzoj 4600 硬币游戏 博弈论
2017-04-25 15:54
246 查看
反硬币操作与c无关,只与2和3的指数有关。设sg[i][j]为2和3的指数分别为i和j时,且前面的硬币都不可翻时的sg值。然后就可以枚举p,q,对于每一个p,q,它的sg值为 sg[i-k*q][j]的异或和以及sg[i][j-k*q]的异或和,求mex。
#include<cstdio> #include<cstring> #include<iostream> #define maxn 30005 using namespace std; int p[maxn]; int n,mxq; bool mark[500]; int sg[20][20]; void get_sg() { memset(sg,0,sizeof(sg)); for(int i=0;i<=15;i++) for(int j=0;j<=15;j++) { memset(mark,0,sizeof(mark)); for(int p=1;p<=i;p++) for(int q=1;q<=mxq;q++) { if(p*q>i) break;int X=0; for(int k=1;k<=q;k++) X^=sg[i-k*p][j]; mark[X]=1; } for(int p=1;p<=j;p++) for(int q=1;q<=mxq;q++) { if(p*q>j) break;int X=0; for(int k=1;k<=q;k++) X^=sg[i][j-k*p]; mark[X]=1; } int k=0;while(mark[k]) k++; sg[i][j]=k; } } int c[maxn],a[maxn],b[maxn]; void calc(int x) { int t=x; while(t%2==0) a[x]++,t/=2; while(t%3==0) b[x]++,t/=3; c[x]=t; } int main() { int T;scanf("%d",&T); for(int i=1;i<=30000;i++)calc(i); while(T--) { scanf("%d%d",&n,&mxq); get_sg(); int Xor=0; for(int i=1;i<=n;i++) { scanf("%d",&p[i]); if(!p[i]) Xor^=sg[a[i]][b[i]]; } if(Xor) puts("win"); else puts("lose"); } return 0; }
相关文章推荐
- 【BZOJ 4600】【SDOI 2016】硬币游戏
- 【BZOJ4600】硬币游戏,博弈
- bzoj4600 [Sdoi2016]硬币游戏 sg函数+结论
- bzoj4600 [Sdoi2016]硬币游戏
- bzoj4600 [Sdoi2016]硬币游戏
- Bzoj4600--Sdoi2016硬币游戏
- [bzoj4600][SDOI2016]硬币游戏
- 【bzoj4600】【SDOI2016】【硬币游戏】【博弈论+dp】
- bzoj1188 分裂游戏 博弈论
- bzoj 1411 [ZJOI2009]硬币游戏
- 【BZOJ】1022: [SHOI2008]小约翰的游戏John(博弈论)
- [BZOJ2017] [Usaco2009 Nov]硬币游戏
- [bzoj1022/poj3480]小约翰的游戏John_博弈论
- [高斯消元 概率 KMP] BZOJ 4820 [Sdoi2017]硬币游戏
- BZOJ 1413 [ZJOI2009] [洛谷2599] 取石子游戏 (博弈论 dp )
- 【博弈论】【SG函数】【枚举】bzoj1874 [BeiJing2009 WinterCamp]取石子游戏
- BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)
- bzoj 4820: [Sdoi2017]硬币游戏【kmp+高斯消元】
- BZOJ 1411 ZJOI2009 硬币游戏
- [Bzoj1022][SHOI2008]小约翰的游戏John(博弈论)