bzoj1188: [HNOI2007]分裂游戏
这是一道很有特点的博弈啊。。。
首先我们可以把每个不同的豆子看成一个子游戏,然后它的SG值就是它所处于的位置,知道这一点就简单了
然后对于当前胜负判断就容易弄了,只要那些豆子数%2==1的SG值合起来就好
方案数可以暴力枚举
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int n,p[30],sg[30]; bool v[11000]; int SG(int i) { if(sg[i]!=-1)return sg[i]; memset(v,false,sizeof(v)); for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) v[SG(j)^SG(k)]=true; for(int u=0;;u++) if(v[u]==false) {sg[i]=u;return sg[i];} } int main() { int T; scanf("%d",&T); while(T--) { int ans=0; scanf("%d",&n); memset(sg,-1,sizeof(sg));sg[n]=0; for(int i=1;i<=n;i++) { scanf("%d",&p[i]); if(p[i]%2==1)ans^=SG(i); } int sum=0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) if((ans^SG(i)^SG(j)^SG(k))==0) { sum++; if(sum==1) printf("%d %d %d\n",i-1,j-1,k-1); } if(sum==0)printf("-1 -1 -1\n"); printf("%d\n",sum); } return 0; }
pain and happy in the cruel world.