【洛谷 1290】 欧几里德的游戏 博弈论

对于任意状态(x,y)如果x>=2*y则先手必胜。原因很简单,假设m=x%y,如果(y,m)是必胜状态,则先手只用取到y+m,由于yx>y只有一种决策,就是取y个,但是时间复杂度已经可以很轻松的承受了

#include
#include
#include
#define LL unsigned long long
#define sswap(a,b) (a^=b^=a^=b)
using namespace std;
LL n,m,T,pos;
char s[3][20]={"Stan wins","Ollie wins"};

int main(){
	scanf("%llu",&T);
	while(T--){
		scanf("%llu%llu",&n,&m);
		if(n0){
			pos^=1;
			if(n>=m*2)break;
			n-=m;
			sswap(n,m);
		}
		printf("%s\n",s[pos]);
	}
	return 0;
}


你可能感兴趣的:(洛谷,博弈论)