[HNOI2007]分裂游戏

这是一道比较水的博弈吧。。。简单来讲根据规则求出sg就好了。。。
注意一下 j 和 k 就好了。。。
呆码:
 
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,T,ans,tot; int sg[10010],a[10010]; bool use[10010]; inline int getsg(int x) { if(x==n) return 0; if(sg[x]!=-1) return sg[x]; memset(use,0,sizeof(use)); for(int i=x+1;i<=n;i++) for(int j=i;j<=n;j++) use[getsg(i)^getsg(j)]=1; for(int i=0;;i++) if(!use[i]) return sg[x]=i; } int main() { scanf("%d",&T); while(T--) { memset(sg,-1,sizeof(sg)); tot=0; ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) if(a[i]&1) ans^=getsg(i); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j;k<=n;k++) { if((ans^getsg(i)^getsg(j)^getsg(k))!=0) continue; tot++; if(tot==1) printf("%d %d %d\n",i-1,j-1,k-1); } if(!tot) printf("-1 -1 -1\n"); printf("%d\n",tot); } return 0; } /* 2 4 1 0 1 5000 3 0 0 1 */
 
                    
                     
                    
                 
                    
                 
 
         
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号