Alice and Bob are playing a turn-based game on a circular field surrounded by flowers. The circle represents the field, and there are x
flowers in the clockwise direction between Alice and Bob, and y
flowers in the anti-clockwise direction between them.
The game proceeds as follows:
- Alice takes the first turn.
- In each turn, a player must choose either the clockwise or anti-clockwise direction and pick one flower from that side.
- At the end of the turn, if there are no flowers left at all, the current player captures their opponent and wins the game.
Given two integers, n
and m
, the task is to compute the number of possible pairs (x, y)
that satisfy the conditions:
- Alice must win the game according to the described rules.
- The number of flowers
x
in the clockwise direction must be in the range[1,n]
. - The number of flowers
y
in the anti-clockwise direction must be in the range[1,m]
.
Return the number of possible pairs (x, y)
that satisfy the conditions mentioned in the statement.
Example 1:
Input: n = 3, m = 2 Output: 3 Explanation: The following pairs satisfy conditions described in the statement: (1,2), (3,2), (2,1).
Example 2:
Input: n = 1, m = 1 Output: 0 Explanation: No pairs satisfy the conditions described in the statement.
Constraints:
1 <= n, m <= 105
According to the problem description, in each move, the player will choose to move in a clockwise or counterclockwise direction and then pick a flower. Since Alice moves first, when
Therefore, the number of flowers
-
is odd; -
; -
.
If
If
Therefore, the number of pairs that meet the conditions is
The time complexity is
class Solution:
def flowerGame(self, n: int, m: int) -> int:
a1 = (n + 1) // 2
b1 = (m + 1) // 2
a2 = n // 2
b2 = m // 2
return a1 * b2 + a2 * b1
class Solution {
public long flowerGame(int n, int m) {
long a1 = (n + 1) / 2;
long b1 = (m + 1) / 2;
long a2 = n / 2;
long b2 = m / 2;
return a1 * b2 + a2 * b1;
}
}
class Solution {
public:
long long flowerGame(int n, int m) {
long long a1 = (n + 1) / 2;
long long b1 = (m + 1) / 2;
long long a2 = n / 2;
long long b2 = m / 2;
return a1 * b2 + a2 * b1;
}
};
func flowerGame(n int, m int) int64 {
a1, b1 := (n+1)/2, (m+1)/2
a2, b2 := n/2, m/2
return int64(a1*b2 + a2*b1)
}
function flowerGame(n: number, m: number): number {
const [a1, b1] = [(n + 1) >> 1, (m + 1) >> 1];
const [a2, b2] = [n >> 1, m >> 1];
return a1 * b2 + a2 * b1;
}
The result obtained from Solution 1 is
If both
If both
If
If
The above four cases can be combined into
The time complexity is
class Solution:
def flowerGame(self, n: int, m: int) -> int:
return (n * m) // 2
class Solution {
public long flowerGame(int n, int m) {
return ((long) n * m) / 2;
}
}
class Solution {
public:
long long flowerGame(int n, int m) {
return ((long long) n * m) / 2;
}
};
func flowerGame(n int, m int) int64 {
return int64((n * m) / 2)
}
function flowerGame(n: number, m: number): number {
return Number(((BigInt(n) * BigInt(m)) / 2n) | 0n);
}