# Find winner in game of N balls, in which a player can remove any balls in range [A, B] in a single move

Given two integers **A** and **B**, and also given that Alice and Bob are playing a game starting with a bag containing **N** balls, in which, in a single move, a player can remove any number of balls between the range **[A, B] **and if the player cannot remove any balls, then the player loses, the task is to find the winner of the game if Alice and Bob play the game alternatively and optimally and Alice starts the game.

**Examples:**

Input:N = 2, A = 1, B = 1Output:BobExplanation:

One way in which the game can be played is:

- Alice removes 1 ball, so the remaining balls are 1.
- Now, Bob removes the last ball.
- Alice cannot remove any balls, so she loses.

Input:N = 3, A = 1, B = 2Output:Bob

**Naive Approach: **The simplest approach is to find the grundy number for every state and find the winning and losing states by using Sprague â€“ Grundy Theorem.

**Time Complexity: **O(N*N!)**Auxiliary Space: **O(N)

**Efficient Approach: **The above approach can be optimized based on the following observations:

- Firstly, it can be observed that
(A + B)is always losing state, because whateverX(A â‰¤ X â‰¤ B)number of balls the current player chooses, the opponent can always empty the bag as there will be(A + B – X)number of balls left whereA â‰¤(A + B – X) â‰¤ B.- Also, from previous observations, one can observe that, for any multiple of
(A + B)say,m*(A + B),the opponent can always reduce the current player to a state of(m – 1)*(A + B)and from(m – 1)*(A + B)to(m – 2)*(A + B)and so on.- Thus, extending the above observation, one can say that for any multiple of
(A + B),the opponent can always reduce the current player to a state of exactly(A + B), which is indeed a losing state. Therefore, all multiples of(A + B)are a losing state.- So, the optimal choice for any player is to reduce the opponent to a multiple of
(A + B),because after this, the player can always win, no matter what the opponent’s moves are.- So, now losing states are the states from which one can never reduce the opponent to a multiple of
(A + B).- Therefore, any player with the state of the form:
((A + B)*m + y), where(0 â‰¤ y â‰¤ A-1)can never force the opponent to reduce to a multiple of(A + B),as any player can only pick at leastAand at mostBnumber of balls.

Follow the steps below to solve the problem:

- If
**N%(A+B)**is less than**A,**then print “**Bob**“. - Otherwise, print “
**Alice**“.

Below is the implementation of the above approach:

## C++

`// C++ program of the above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to find the winner of the` `// game` `string NimGame(` `int` `N, ` `int` `A, ` `int` `B)` `{` ` ` `// Stores sum of A and B` ` ` `int` `sum = A + B;` ` ` `// If N is of the form` ` ` `// m*(A+B)+y` ` ` `if` `(N % sum <= A - 1)` ` ` `return` `"Bob"` `;` ` ` `// Otherwise,` ` ` `else` ` ` `return` `"Alice"` `;` `}` `// Driver code` `int` `main()` `{` ` ` `// Input` ` ` `int` `N = 3, A = 1, B = 2;` ` ` `// Function call` ` ` `cout << NimGame(N, A, B) << endl;` ` ` `return` `0;` `}` |

## Java

`// Java Program for the above approach` `import` `java.io.*;` `class` `GFG` `{` ` ` `// Function to find the winner of the` ` ` `// game` ` ` `public` `static` `String NimGame(` `int` `N, ` `int` `A, ` `int` `B)` ` ` `{` ` ` `// Stores sum of A and B` ` ` `int` `sum = A + B;` ` ` `// If N is of the form` ` ` `// m*(A+B)+y` ` ` `if` `(N % sum <= A - ` `1` `)` ` ` `return` `"Bob"` `;` ` ` `// Otherwise,` ` ` `else` ` ` `return` `"Alice"` `;` ` ` `}` ` ` `public` `static` `void` `main (String[] args)` ` ` `{` ` ` `// Input` ` ` `int` `N = ` `3` `, A = ` `1` `, B = ` `2` `;` ` ` `// Function call` ` ` `System.out.println(NimGame(N, A, B));` ` ` `}` `}` ` ` `// This code is contributed by Potta Lokesh` |

## Python3

`# Python3 program of the above approach` `# Function to find the winner of the game` `def` `NimGame(N, A, B):` ` ` ` ` `# Stores sum of A and B` ` ` `sum` `=` `A ` `+` `B` ` ` ` ` `# If N is of the form` ` ` `# m*(A+B)+y` ` ` `if` `(N ` `%` `sum` `<` `=` `A ` `-` `1` `):` ` ` `return` `"Bob"` ` ` ` ` `# Otherwise,` ` ` `else` `:` ` ` `return` `"Alice"` `# Driver code` `# Input` `N ` `=` `3` `A ` `=` `1` `B ` `=` `2` `# Function call` `print` `(NimGame(N, A, B))` `# This code is contributed by amreshkumar3` |

## C#

`// C# program of the above approach` `using` `System;` `class` `GFG{` `// Function to find the winner of the` `// game` `public` `static` `String NimGame(` `int` `N, ` `int` `A, ` `int` `B)` `{` ` ` ` ` `// Stores sum of A and B` ` ` `int` `sum = A + B;` ` ` ` ` `// If N is of the form` ` ` `// m*(A+B)+y` ` ` `if` `(N % sum <= A - 1)` ` ` `return` `"Bob"` `;` ` ` ` ` `// Otherwise,` ` ` `else` ` ` `return` `"Alice"` `;` `}` `// Driver code` `static` `void` `Main()` `{` ` ` ` ` `// Input` ` ` `int` `N = 3, A = 1, B = 2;` ` ` ` ` `// Function call` ` ` `Console.Write(NimGame(N, A, B));` `}` `}` `// This code is contributed by SoumikMondal` |

## Javascript

`<script>` ` ` `// JavaScript program for the above approach` ` ` `// Function to find the winner of the` ` ` `// game` ` ` `function` `NimGame(N, A, B) {` ` ` `// Stores sum of A and B` ` ` `let sum = A + B;` ` ` `// If N is of the form` ` ` `// m*(A+B)+y` ` ` `if` `(N % sum <= A - 1)` ` ` `return` `"Bob"` `;` ` ` `// Otherwise,` ` ` `else` ` ` `return` `"Alice"` `;` ` ` `}` ` ` `// Driver code` ` ` `// Input` ` ` `let N = 3, A = 1, B = 2;` ` ` `// Function call` ` ` `document.write(NimGame(N, A, B) + ` `"<br>"` `);` ` ` `// This code is contributed by Potta Lokesh` ` ` `</script>` |

**Output**

Bob

* Time Complexity: *O(1)

*O(1)*

**Auxiliary Space:**