Frobenius coin problem
Last Updated :
07 Dec, 2022
Given two coins of denominations “X” and “Y” respectively, find the largest amount that cannot be obtained using these two coins (assuming an infinite supply of coins) followed by the total number of such non-obtainable amounts, if no such value exists print “NA”.
Examples :
Input : X=2, Y=5
Output: Largest amount = 3
Total count = 2
We cannot represent 1 and 3 from infinite supply
of given two coins. The largest among these 2 is 3.
We can represent all other amounts for example 13
can be represented 2*4 + 5.
Input : X=5, Y=10
Output: NA
There are infinite number of amounts that cannot
be represented by these two coins.
One important observation is, if GCD of X and Y is not one, then all values that can be formed by given two coins are multiples of GCD. For example if X = 4 and Y = 6. Then all values are multiple of 2. So all values that are not multiple of 2, cannot be formed by X and Y. Thus there exist infinitely many values that cannot be formed by 4 and 6, and our answer becomes “NA”. This general problem for n coins is known as classic Forbenius coin problem.
When the number of coins is two, there is
explicit formula if GCD is not 1. The formula
is:
Largest amount A = (X * Y) - (X + Y)
Total count = (X -1) * (Y - 1) /2
Hence, we can now easily answer the above question by following the below steps:
- Calculate GCD of X and Y
- If GCD is 1 then required largest amount is (X*Y)-(X+Y) and total count is (X-1)*(Y-1)/2
- Else print “NA”
Below is the program based on the same.
C++
#include <bits/stdc++.h>
using namespace std;
int gcd( int a, int b)
{
int c;
while (a != 0)
{
c = a;
a = b%a;
b = c;
}
return b;
}
void forbenius( int X, int Y)
{
if (gcd(X,Y) != 1)
{
cout << "NA\n" ;
return ;
}
int A = (X*Y)-(X+Y);
int N = (X-1)*(Y-1)/2;
cout << "Largest Amount = " << A << endl;
cout << "Total Count = " << N << endl;
}
int main()
{
int X = 2,Y = 5;
forbenius(X,Y);
X = 5, Y = 10;
cout << endl;
forbenius(X,Y);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int gcd( int a, int b)
{
int c;
while (a != 0 )
{
c = a;
a = b % a;
b = c;
}
return b;
}
static void forbenius( int X,
int Y)
{
if (gcd(X, Y) != 1 )
{
System.out.println( "NA" );
return ;
}
int A = (X * Y) - (X + Y);
int N = (X - 1 ) * (Y - 1 ) / 2 ;
System.out.println( "Largest Amount = " + A );
System.out.println( "Total Count = " + N );
}
public static void main(String[] args)
{
int X = 2 ,Y = 5 ;
forbenius(X, Y);
X = 5 ;
Y = 10 ;
System.out.println();
forbenius(X, Y);
}
}
|
Python3
def gcd(a, b):
while (a ! = 0 ):
c = a;
a = b % a;
b = c;
return b;
def forbenius(X, Y):
if (gcd(X, Y) ! = 1 ):
print ( "NA" );
return ;
A = (X * Y) - (X + Y);
N = (X - 1 ) * (Y - 1 ) / / 2 ;
print ( "Largest Amount =" , A);
print ( "Total Count =" , N);
X = 2 ;
Y = 5 ;
forbenius(X, Y);
X = 5 ;
Y = 10 ;
print ("");
forbenius(X, Y);
|
C#
using System;
class GFG
{
static int gcd( int a, int b)
{
int c;
while (a != 0)
{
c = a;
a = b%a;
b = c;
}
return b;
}
static void forbenius( int X, int Y)
{
if (gcd(X,Y) != 1)
{
Console.WriteLine( "NA" );
return ;
}
int A = (X * Y) - (X + Y);
int N = (X - 1) * (Y - 1) / 2;
Console.WriteLine( "Largest Amount = " + A );
Console.WriteLine( "Total Count = " + N );
}
public static void Main()
{
int X = 2,Y = 5;
forbenius(X,Y);
X = 5;
Y = 10;
Console.WriteLine();
forbenius(X,Y);
}
}
|
PHP
<?php
function gcd( $a , $b )
{
$c ;
while ( $a != 0)
{
$c = $a ;
$a = $b % $a ;
$b = $c ;
}
return $b ;
}
function forbenius( $X , $Y )
{
if (gcd( $X , $Y ) != 1)
{
echo "NA\n" ;
return ;
}
$A = ( $X * $Y ) - ( $X + $Y );
$N = ( $X - 1) * ( $Y - 1) / 2;
echo "Largest Amount = " , $A , "\n" ;
echo "Total Count = " , $N , "\n" ;
}
$X = 2; $Y = 5;
forbenius( $X , $Y );
$X = 5; $Y = 10;
echo "\n" ;
forbenius( $X , $Y );
?>
|
Javascript
function gcd(a, b)
{
let c;
while (a != 0)
{
c = a;
a = b%a;
b = c;
}
return b;
}
function forbenius(X, Y)
{
if (gcd(X,Y) != 1)
{
console.log( "NA" );
return ;
}
let A = (X*Y)-(X+Y);
let N = (X-1)*(Y-1)/2;
console.log( "Largest Amount = " + A);
console.log( "Total Count = " + N);
}
let X = 2,Y = 5;
forbenius(X,Y);
console.log();
X = 5, Y = 10;
forbenius(X,Y);
|
Output
Largest Amount = 3
Total Count = 2
NA
Time Complexity: O(log(min(X,Y))
Auxiliary Space: O(log(min(X,Y))
References:
https://en.wikipedia.org/wiki/Coin_problem
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...