Problem

Alice and Bob take turns playing a game, with Alice starting first.

Initially, there is a number n on the chalkboard. On each player’s turn, that player makes a move consisting of:

  • Choosing any x with 0 < x < n and n % x == 0.
  • Replacing the number n on the chalkboard with n - x.

Also, if a player cannot make a move, they lose the game.

Return true if and only if Alice wins the game, assuming both players play optimally.

Examples

Example 1:

1
2
3
Input: n = 2
Output: true
Explanation: Alice chooses 1, and Bob has no more moves.

Example 2:

1
2
3
Input: n = 3
Output: false
Explanation: Alice chooses 1, Bob chooses 1, and Alice has no more moves.

Solution

Method 1 – Mathematical Parity

Intuition

If n is even, Alice can always win by making n odd for Bob. If n is odd, Bob will always win by making n even for Alice. This is because every move reduces n by an odd divisor, flipping the parity.

Approach

  1. If n is even, Alice wins.
  2. If n is odd, Bob wins.
  3. Return n % 2 == 0.

Code

1
2
3
4
5
6
class Solution {
public:
    bool divisorGame(int n) {
        return n % 2 == 0;
    }
};
1
2
3
func divisorGame(n int) bool {
    return n%2 == 0
}
1
2
3
4
5
class Solution {
    public boolean divisorGame(int n) {
        return n % 2 == 0;
    }
}
1
2
3
4
5
class Solution {
    fun divisorGame(n: Int): Boolean {
        return n % 2 == 0
    }
}
1
2
3
class Solution:
    def divisorGame(self, n: int) -> bool:
        return n % 2 == 0
1
2
3
4
5
impl Solution {
    pub fn divisor_game(n: i32) -> bool {
        n % 2 == 0
    }
}
1
2
3
4
5
class Solution {
    divisorGame(n: number): boolean {
        return n % 2 === 0;
    }
}

Complexity

  • ⏰ Time complexity: O(1) — Only a parity check.
  • 🧺 Space complexity: O(1) — No extra space used.