[SDOI2009]E&D

[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;
}
原文地址:https://www.cnblogs.com/skylee03/p/9768290.html