题目地址:
https://leetcode.com/problems/divisor-game/
给定一个正整数 n n n,甲乙两个人玩游戏,轮流操作,每次操作可以选一个数 x , 0 < x < n x,0<x<n x,0<x<n并且 x ∣ n x|n x∣n,并将当前的 n n n替换为 n − x n-x n−x。替换不下去的人输。问先手是否必胜。
如果 n n n是偶数,则先手必胜。可以对 n n n归纳,如果 n = 1 n=1 n=1显然必输,如果 n = 2 n=2 n=2,则甲取 x = 1 x=1 x=1,甲剩。对于其余偶数,甲只需要取 x = 1 x=1 x=1,那么乙面对的是 n − 1 n-1 n−1是奇数,由于 x ∣ ( n − 1 ) x|(n-1) x∣(n−1),所以 x x x必然是奇数,所以 n − 1 − x n-1-x n−1−x必然是偶数,并且 n − 1 − x < n n-1-x<n n−1−x<n,由归纳假设,甲必胜。如果 n n n是奇数,由上面的证明知道无论取什么 x x x都有 n − x n-x n−x是偶数,所以乙必胜,甲必败。代码如下:
class Solution {
public:
bool divisorGame(int n) { return n % 2 == 0; }
};
时空复杂度 O ( 1 ) O(1) O(1)。
这篇博客讨论了一个名为‘除数游戏’的数学问题,玩家甲乙轮流从正整数n中减去小于n的因子x。当无法继续操作时,对手输。文章证明了若n为偶数,先手(甲)必胜;若n为奇数,后手(乙)必胜。给出的解决方案是通过判断n的奇偶性来确定胜负。代码实现简洁,时间复杂度为O(1)。
685

被折叠的 条评论
为什么被折叠?



