[SDOI2009]E&D
题目大意:
有(2n(nle2 imes10^4))堆石子,第(i)堆石子有(x_i)个,第(2k)与第(2k+1)堆为一组。每次选取一组,移除其中一堆,并从另一堆石子中取出若干颗放到被移除的位置上。操作过程中需要保证任意一堆石子个数为正,两人轮流操作,不能操作者负,问若两人都按照最优策略,最后谁能取胜?
思路:
每组石子是一个相对独立的游戏,对于每组两堆石子的个数暴力计算SG函数并打表,发现后继状态SG值集合(S)用二进制表示的结果为((x_1-1)vee(x_2-1))。
证明略。
源代码:
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
int main() {
for(register int T=getint();T;T--) {
const int n=getint()>>1;
int sg=0;
for(register int i=0;i<n;i++) {
int s=(getint()-1)|(getint()-1),mex=0;
for(;s&1;s>>=1) mex++;
sg^=mex;
}
puts(sg?"YES":"NO");
}
return 0;
}