[HNOI2007]分裂游戏
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1394 Solved: 847
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4
1 0 1 5000
3
0 0 1
Sample Output
1
-1 -1 -1
0
HINT
Source
题解:这道题目,将每颗石子单独作为一个游戏去玩,这样枚举下一次的j,k
最后再xor起来即可。
方法的话就是判断取了这一个后下一个状态是不是必败了即可。
1 #pragma GCC optimize(2) 2 #pragma G++ optimize(2) 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdio> 7 #include<cstring> 8 9 #define N 27 10 using namespace std; 11 inline int read() 12 { 13 int x=0,f=1;char ch=getchar(); 14 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 15 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 16 return x*f; 17 } 18 19 int a[N],sg[N]; 20 void pre() 21 { 22 bool mark[20001]; 23 sg[1]=0; 24 for(int i=2;i<=25;i++) 25 { 26 memset(mark,0,sizeof(mark)); 27 for(int j=1;j<i;j++) 28 for(int k=1;k<=j;k++) 29 mark[sg[j]^sg[k]]=1; 30 for(int j=0;;j++) 31 if(!mark[j]){sg[i]=j;break;} 32 } 33 } 34 int main() 35 { 36 int t,n; 37 pre(); 38 scanf("%d",&t); 39 while(t--) 40 { 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 43 int ans=0,tot=0; 44 for(int i=1;i<=n;i++) 45 if(a[i]&1)ans^=sg[n-i+1]; 46 for(int i=1;i<=n;i++) 47 for(int j=i+1;j<=n;j++) 48 for(int k=j;k<=n;k++) 49 if((ans^sg[n-i+1]^sg[n-j+1]^sg[n-k+1])==0) 50 { 51 tot++; 52 if(tot==1)printf("%d %d %d\n",i-1,j-1,k-1); 53 } 54 if(!tot)printf("-1 -1 -1\n"); 55 printf("%d\n",tot); 56 } 57 }