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);
}