Loading

POJ 2348 Euclid's Game(博弈论 辗转相减)

POJ 2348 Euclid's Game(博弈论 辗转相减)

题目:

​ 给出两个数,A,B轮流操作。每次操作可以将大的数减去小的数的整数倍,若操作后出现0,执行这次操作的人胜。

思路:

​ 根据样例(25, 7)的提示,其实是非常容易想到的。从(25, 7)可以到达(11, 7)或者(4, 7)。易证这两个状态之间必定有一个会胜利,这时执行者就掌握了主动权。所以对于(a, b),存在\(max(a, b) \ge 2 * min(a, b)\)时必胜。还有当大的数是小的数的倍数的时候,也可以直接获胜。通过上面两个结论,就可以完成程序了。

实现:

经典POJ毒瘤,连数据范围都不给。要开\(ll\)

bool dfs(ll a, ll b)
{
	if(a < b)	swap(a, b);
	if(a % b == 0)	return true;
	if(a >= 2ll * b)	return true;
	return !dfs(b, a - b);
}
posted @ 2022-10-03 08:06  DM11  阅读(17)  评论(0编辑  收藏  举报