[洛谷P1290][题解]欧几里德的游戏

一个蒟蒻的肺腑之言:感觉博弈论的黄题比平衡树的紫题还要难呢呜呜呜(还不是因为太蒟)

0.题意

现在有两个数,两个人轮流玩游戏,每次从较大数中取出若干较小数的倍数,取到0者获胜。
给出两个数,问在两人都采用最优策略的情况下谁能赢。

1.思路

博弈论自然要考虑必胜态和必败态。(以下抄一段我题解时的稿)
设当前状态为([a,b]),其中(aleq b)
分三种情况:
1.(a=b)显然直接赢了
2.设(b=qa+r),若(bgeq 2a),则可以转到([a,r+a]or[r,a])
([r,a])必胜,直接转;
([r,a])必败,则先转到([a,r+a]),将必败态扔给对手。
所以必胜。
3.(b<2a),此时只能暴力模拟了,(go to 2)

2.代码

我采用了递归模拟,上面说到的细节都在代码里体现了。
函数参数的命名有点诡异,winner是当前操作,人名是两个数字。——特此注。

int C,n,m;
bool Play(int stan,int ollie,bool winner){
	if(stan==ollie||ollie/stan>=2)return winner;
	else return Play(ollie-stan,stan,!winner);
}
int main(){
	Read(C);
	while(C--){
		Read(m),Read(n);
		if(m>n)swap(m,n);
		cout<<(Play(m,n,0)?"Ollie wins":"Stan wins")<<endl;
	}
	return 0;
}

(话说博弈论的代码总是出奇的短呢)

3.完结撒花

原文地址:https://www.cnblogs.com/juruoajh/p/12906114.html