题目地址:
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)。