Open In App

Find the winner of a game of donating i candies in every i-th move

Improve
Improve
Like Article
Like
Save
Share
Report

Given two integers X and Y representing the number of candies allocated to players A and B respectively, where both the players indulge in a game of donating i candies to the opponent in every ith move. Starting with player A, the game continues with alternate turns until a player is unable to donate the required amount of candies and loses the game, the task is to find the winner of the game.

Examples:

Input: X = 2, Y = 3
Output: A
Explanation: The game turns out in the following manner:

Step

X

Y

0

2

3

1

1

4

2

3

2

3

0

5

4

4

1

Since A fails to donate 5 candies in the 5th step, B wins the game.

 Input: X = 2, Y = 1
Output: B
Explanation: The game turns out in the following manner:

Step X Y
0 2 1
1 1 2
2 3 0
3 0 3

Since B fails to give 4 candies in the 4th step, A wins the game.

 

Approach: The idea is to solve the problem based on the following observation:

Step

Number of candies
Possessed by A

Number of candies
Possessed by B

0

X

Y

1

X – 1

Y + 1

2

X – 1 + 2 = X + 1

Y + 1 – 2 = Y – 1

3

X – 2

Y + 2

4

X + 2

Y – 2

  • The player whose candies reduce to 0 first, will not be having enough candies to give in the next move.
  • Count of candies of player A decreases by 1 in odd moves.
  • Count of candies of player B decreases by 1 in even moves.

Follow the steps below to solve the problem:

  1. Initialize two variables, say chanceA and chanceB, representing the number of moves in which the number of candies possessed by a player reduces to 0.
  2. Since count of candies of player A decreases by 1 in odd moves, chanceA = 2 * (X – 1) + 1
  3. Since count of candies of player B decreases by 1 in even moves, chanceB = 2 * Y
  4. If chanceA < chanceB, then B will be the winning player.
  5. Otherwise, A will be the winning player.
  6. Print the winning player.

Below is the implementation of the above approach:

C++




// C++ Program for the
// above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the winning
// player in a game of donating i
// candies to opponent in i-th move
int stepscount(int a, int b)
{
    // Steps in which number of
    // candies of player A finishes
    int chanceA = 2 * a - 1;
 
    // Steps in which number of
    // candies of player B finishes
    int chanceB = 2 * b;
 
    // If A's candies finishes first
    if (chanceA < chanceB) {
        cout << "B";
    }
 
    // Otherwise
    else if (chanceB < chanceA) {
        cout << "A";
    }
 
    return 0;
}
 
// Driver Code
int main()
{
    // Input
 
    // Candies possessed
    // by player A
    int A = 2;
 
    // Candies possessed
    // by player B
    int B = 3;
 
    stepscount(A, B);
 
    return 0;
}


Java




// Java Program for above approach
class GFG{
     
// Function to find the winning
// player in a game of donating i
// candies to opponent in i-th move
static void stepscount(int a, int b)
{
     
    // Steps in which number of
    // candies of player A finishes
    int chanceA = 2 * a - 1;
 
    // Steps in which number of
    // candies of player B finishes
    int chanceB = 2 * b;
 
    // If A's candies finishes first
    if (chanceA < chanceB)
    {
        System.out.print("B");
    }
 
    // Otherwise
    else if (chanceB < chanceA)
    {
        System.out.print("A");
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    // Input
    // Candies possessed by player A
    int A = 2;
 
    // Candies possessed by player B
    int B = 3;
 
    stepscount(A, B);
}
}
 
// This code is contributed by abhinavjain194


Python3




# Python3 program for the above approach
 
# Function to find the winning
# player in a game of donating i
# candies to opponent in i-th move
def stepscount(a, b):
     
    # Steps in which number of
    # candies of player A finishes
    chance_A = 2 * a - 1
     
    # Steps in which number of
    # candies of player B finishes
    chance_B = 2 * b
     
    # If A's candies finishes first
    if (chance_A < chance_B):
        return 'B'
         
    # Otherwise   
    else:
        return "A"
 
# Driver code
 
# Candies possessed by player A       
A = 2
 
# Candies possessed by player B
B = 3
 
print(stepscount(A, B))
 
# This code is contributed by abhinavjain194


C#




// C# program for the above approach
using System;
 
class GFG{
     
// Function to find the winning
// player in a game of donating i
// candies to opponent in i-th move
static void stepscount(int a, int b)
{
     
    // Steps in which number of
    // candies of player A finishes
    int chanceA = 2 * a - 1;
 
    // Steps in which number of
    // candies of player B finishes
    int chanceB = 2 * b;
 
    // If A's candies finishes first
    if (chanceA < chanceB)
    {
        Console.Write("B");
    }
 
    // Otherwise
    else if (chanceB < chanceA)
    {
        Console.Write("A");
    }
}
 
// Driver code
static void Main()
{
     
    // Input
    // Candies possessed by player A
    int A = 2;
 
    // Candies possessed by player B
    int B = 3;
 
    stepscount(A, B);
}
}
 
// This code is contributed by abhinavjain194


Javascript




<script>
 
// Javascript program for the above approach
 
 
// Function to find the winning
// player in a game of donating i
// candies to opponent in i-th move
function stepscount( a, b)
{
    // Steps in which number of
    // candies of player A finishes
    let chanceA = 2 * a - 1;
 
    // Steps in which number of
    // candies of player B finishes
    ;let chanceB = 2 * b;
 
    // If A's candies finishes first
    if (chanceA < chanceB) {
        document.write("B");
    }
 
    // Otherwise
    else if (chanceB < chanceA) {
        document.write("A");
    }
 
    return 0;
}
 
// Driver Code
 
// Input
 
// Candies possessed
// by player A
let A = 2;
 
// Candies possessed
// by player B
let B = 3;
 
stepscount(A, B);
 
</script>


Output: 

B

 

Time Complexity: O(1)
Auxiliary Space: O(1)

 



Last Updated : 25 May, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads