Two Balls Reachability Game
Last Updated :
15 Nov, 2021
Given A numbers of white and B numbers of black balls. You need to have X number of white and Y number of black balls (A <= X, B <= Y) to win the game by doing some(zero or more) operations.
In one operation: At any moment if you have p white and q black balls then at that moment you can buy q white or p black balls.
Find if it’s possible to have X white and Y black balls at the end or not.
Examples:
Input: A = 1, B = 1, X = 3, Y = 8
Output: POSSIBLE
Explanation:
The steps are, (1, 1)->(1, 2)->(3, 2)->(3, 5)->(3, 8)
Input: A = 3, Y = 2, X = 4, Y = 6
Output: NOT POSSIBLE
Approach:
We have to solve this problem using the property of gcd. Let’s see how.
- Initially, we have A white and B black ball. We have to get rest of the X-A Red balls and Y-B Black balls.
- Below is the property of gcd of two numbers that we will use,
gcd(x, y) = gcd(x + y, y)
gcd(x, y) = gcd(x, y + x)
-
- This property is the same as the operation which is mentioned in the question. So from here, we get that if the gcd of the final state is the same as gcd of initial state then it is always possible to reach the goal, otherwise not.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
void IsPossible( int a, int b,
int x, int y)
{
int final = gcd(x, y);
int initial = gcd(a, b);
if (initial == final)
{
cout << "POSSIBLE\n" ;
}
else
{
cout << "NOT POSSIBLE\n" ;
}
}
int main()
{
int A = 1, B = 2, X = 4, Y = 11;
IsPossible(A, B, X, Y);
A = 2, B = 2, X = 3, Y = 6;
IsPossible(A, B, X, Y);
return 0;
}
|
Java
import java.io.*;
class GFG{
static int gcd( int a, int b)
{
if (b == 0 )
return a;
return gcd(b, a % b);
}
static void IsPossible( int a, int b,
int x, int y)
{
int g = gcd(x, y);
int initial = gcd(a, b);
if (initial == g)
{
System.out.print( "POSSIBLE\n" );
}
else
{
System.out.print( "NOT POSSIBLE\n" );
}
}
public static void main(String args[])
{
int A = 1 , B = 2 , X = 4 , Y = 11 ;
IsPossible(A, B, X, Y);
A = 2 ; B = 2 ; X = 3 ; Y = 6 ;
IsPossible(A, B, X, Y);
}
}
|
Python3
def gcd(a, b) :
if (b = = 0 ) :
return a;
return gcd(b, a % b);
def IsPossible(a, b, x, y) :
final = gcd(x, y);
initial = gcd(a, b);
if (initial = = final) :
print ( "POSSIBLE" );
else :
print ( "NOT POSSIBLE" );
if __name__ = = "__main__" :
A = 1 ; B = 2 ; X = 4 ; Y = 11 ;
IsPossible(A, B, X, Y);
A = 2 ; B = 2 ; X = 3 ; Y = 6 ;
IsPossible(A, B, X, Y);
|
C#
using System;
using System.Linq;
class GFG {
static int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
static void IsPossible( int a, int b,
int x, int y)
{
int g = gcd(x, y);
int initial = gcd(a, b);
if (initial == g)
{
Console.Write( "POSSIBLE\n" );
}
else
{
Console.Write( "NOT POSSIBLE\n" );
}
}
static public void Main()
{
int A = 1, B = 2;
int X = 4, Y = 11;
IsPossible(A, B, X, Y);
A = 2; B = 2;
X = 3; Y = 6;
IsPossible(A, B, X, Y);
}
}
|
Javascript
<script>
function gcd(a, b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
function IsPossible(a, b, x, y)
{
let final = gcd(x, y);
let initial = gcd(a, b);
if (initial == final)
{
document.write( "POSSIBLE" + "</br>" );
}
else
{
document.write( "NOT POSSIBLE" + "</br>" );
}
}
let A = 1, B = 2, X = 4, Y = 11;
IsPossible(A, B, X, Y);
A = 2, B = 2, X = 3, Y = 6;
IsPossible(A, B, X, Y);
</script>
|
Output:
POSSIBLE
NOT POSSIBLE
Time Complexity: O(log(max(A, B, X, Y)))
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...