传送门
【题目分析】
很好的博弈论分析题。
首先这个题明显可以分为独立的n/2个子游戏,所以只用判sg值的异或和是否为0即可。
所以考虑每一个子游戏。
首先先给结论:只要有一堆石子为偶数,那么当前局势必胜;如果两堆均为奇数,那么当前必败。
下面给出证明:
1.如果两堆为奇数,由于最后的目标状态(1,1)也为两个奇数,而奇数只能分为一个奇数与一个偶数之和,所以自己只能分为一堆奇数一堆偶数,而对手可以直接将偶数的移为两个奇数,如此循环一定是对手将其分为两个1。
2.反之只要有一堆偶数,就可以拆成两个奇数,回到1,对面必败。
3.至于有一堆是偶数的gs值,是,至于证明emmm,还没想明白(打表大法好)。
【代码~】
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
LL n;
LL x,y;
LL ans;
LL Read(){
LL i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
LL gs(int x,int y){
LL ret=0;
while(1){
if((x%2==1)&&(y%2==1))
return ret;
x=(x+1)/2,y=(y+1)/2;
++ret;
}
}
int main(){
int T=Read();
while(T--){
ans=0;
n=Read();
for(int i=1;i<=n/2;++i){
x=Read(),y=Read();
ans^=gs(x,y);
}
if(ans)
puts("YES");
else
puts("NO");
}
return 0;
}