1025. Divisor Game
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
with0 < x < N
andN % x == 0
.Replacing the number
N
on the chalkboard withN - 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.
Example 1:
Input: 2
Output: true
Explanation: Alice chooses 1, and Bob has no more moves.
Example 2:
Input: 3
Output: false
Explanation: Alice chooses 1, Bob chooses 1, and Alice has no more moves.
Note:
1 <= N <= 1000
// Math
bool divisorGame(int N) {
return N % 2 == 0;
}
// Top-Down Recursive DP
bool helper(int N, vector<int>& dp, bool res) {
if (dp[N] != 0) return dp[N] == 1;
for (int i = 1; !res && i * i < N; ++i) {
if (N % i == 0) res = !helper(N - i, dp, res);
}
dp[N] = res ? 1 : -1;
return res;
}
bool divisorGame(int N) {
vector<int> dp(1001, 0);
return helper(N, dp, false);
}
// Bottom-Up DP
bool divisorGame(int N) { // time: O(N^2); space: O(N)
vector<bool> dp(N + 1, false);
for (int i = 2; i <= N; ++i) {
for (int j = 1; j < i; ++j) {
if (i % j == 0) {
if (!dp[i - j]) { // If Alice chooses i, and will let her opponent lose
dp[i] = true;
break;
}
}
}
}
return dp[N];
}
Last updated
Was this helpful?