1 /*UVALive 5059 2 建立 SG函数: 3 单堆:每次拿走至少一个石子,不能拿走超过一半的石子; 4 边界:SG[1]=0; 5 公式:SG[X]=MEX{SG[X-1],SG[X-2]....,SG[x-x/2]} 6 测试: 7 8 int SG[105],vis[105]; 9 int main() 10 { 11 memset(SG,-1,sizeof(SG)); 12 SG[1]=0; 13 for(int i=2;i<=100;i++) 14 { 15 memset(vis,0,sizeof(vis)); 16 for(int j=i-i/2;j<=i-1;j++) vis[SG[j]]=1; 17 for(int j=0;j<=100;j++) if(!vis[j]) {SG[i]=j;break;} 18 } 19 for(int i=1;i<=20;i++) cout<<SG[i]<<" "; 20 //ans=0 1 0 2 1 3 0 4 2 5 1 6 3 7 0 8 4 9 2 10 21 } 22 拓展公式: 23 SG[X]=X/2,X为偶数 24 SG[X]=SG[X/2],X为奇数,向下取整 25 */ 26 27 #include<iostream> 28 #include<stdio.h> 29 #include<string.h> 30 #include<algorithm> 31 #include<stdlib.h> 32 #include<math.h> 33 #include<queue> 34 #include<vector> 35 #include<map> 36 37 using namespace std; 38 39 long long SG(long long x) 40 { 41 return x%2==0?x/2:SG(x/2); 42 } 43 int main() 44 { 45 int t; 46 cin>>t; 47 while(t--) 48 { 49 long long v=0,n,a; 50 cin>>n; 51 for(int i=0;i<n;i++){ 52 cin>>a;v^=SG(a); 53 } 54 if (!v) cout<<"NO"<<endl;else cout<<"YES"<<endl; 55 } 56 }