Dadas dos monedas de denominaciones «X» e «Y» respectivamente, encuentre la cantidad más grande que no se puede obtener usando estas dos monedas (suponiendo que haya una cantidad infinita de monedas) seguido del número total de dichas cantidades no obtenibles, si no existe tal valor imprimir «N / A».
Ejemplos:
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.
Le recomendamos encarecidamente que haga clic aquí y lo practique antes de pasar a la solución.
Una observación importante es que, si el MCD de X e Y no es uno, entonces todos los valores que se pueden formar con dos monedas dadas son múltiplos del MCD. Por ejemplo, si X = 4 e Y = 6. Entonces todos los valores son múltiplos de 2. Entonces, todos los valores que no son múltiplos de 2, no pueden estar formados por X e Y. Por lo tanto, existen infinitos valores que no pueden estar formados por 4 y 6, y nuestra respuesta se convierte en «NA».
Este problema general para n monedas se conoce como problema clásico de monedas de Forbenius.
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
Por lo tanto, ahora podemos responder fácilmente a la pregunta anterior siguiendo los pasos a continuación:
- Calcular MCD de X e Y
- Si GCD es 1, entonces la cantidad más grande requerida es (X*Y)-(X+Y) y el recuento total es (X-1)*(Y-1)/2
- De lo contrario, escriba «NA»
A continuación se muestra el programa basado en el mismo.
C++
// C++ program to find the largest number that // cannot be formed from given two coins #include <bits/stdc++.h> using namespace std; // Utility function to find gcd int gcd( int a, int b) { int c; while (a != 0) { c = a; a = b%a; b = c; } return b; } // Function to print the desired output void forbenius( int X, int Y) { // Solution doesn't exist // if GCD is not 1 if (gcd(X,Y) != 1) { cout << "NA\n" ; return ; } // Else apply the formula int A = (X*Y)-(X+Y); int N = (X-1)*(Y-1)/2; cout << "Largest Amount = " << A << endl; cout << "Total Count = " << N << endl; } // Driver Code int main() { int X = 2,Y = 5; forbenius(X,Y); X = 5, Y = 10; cout << endl; forbenius(X,Y); return 0; } |
Java
// Java program to find the largest // number that cannot be formed // from given two coins import java.io.*; class GFG { // Utility function to find gcd static int gcd( int a, int b) { int c; while (a != 0 ) { c = a; a = b % a; b = c; } return b; } // Function to print the // desired output static void forbenius( int X, int Y) { // Solution doesn't exist // if GCD is not 1 if (gcd(X, Y) != 1 ) { System.out.println( "NA" ); return ; } // Else apply the formula 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 ); } // Driver Code public static void main(String[] args) { int X = 2 ,Y = 5 ; forbenius(X, Y); X = 5 ; Y = 10 ; System.out.println(); forbenius(X, Y); } } // This code is contributed by Sam007 |
Python3
# Python3 program to find the largest # number that cannot be formed # from given two coins # Utility function to find gcd def gcd(a, b): while (a ! = 0 ): c = a; a = b % a; b = c; return b; # Function to print the desired output def forbenius(X, Y): # Solution doesn't exist # if GCD is not 1 if (gcd(X, Y) ! = 1 ): print ( "NA" ); return ; # Else apply the formula A = (X * Y) - (X + Y); N = (X - 1 ) * (Y - 1 ) / / 2 ; print ( "Largest Amount =" , A); print ( "Total Count =" , N); # Driver Code X = 2 ; Y = 5 ; forbenius(X, Y); X = 5 ; Y = 10 ; print (""); forbenius(X, Y); # This code is contributed by mits |
C#
// C# program to find the largest // number that cannot be formed // from given two coins using System; class GFG { // Utility function to find gcd static int gcd( int a, int b) { int c; while (a != 0) { c = a; a = b%a; b = c; } return b; } // Function to print the // desired output static void forbenius( int X, int Y) { // Solution doesn't exist // if GCD is not 1 if (gcd(X,Y) != 1) { Console.WriteLine( "NA" ); return ; } // Else apply the formula int A = (X * Y) - (X + Y); int N = (X - 1) * (Y - 1) / 2; Console.WriteLine( "Largest Amount = " + A ); Console.WriteLine( "Total Count = " + N ); } // Driver Code public static void Main() { int X = 2,Y = 5; forbenius(X,Y); X = 5; Y = 10; Console.WriteLine(); forbenius(X,Y); } } // This code is contributed by Sam007 |
PHP
<?php // php program to find the largest // number that cannot be formed // from given two coins // Utility function to find gcd function gcd( $a , $b ) { $c ; while ( $a != 0) { $c = $a ; $a = $b % $a ; $b = $c ; } return $b ; } // Function to print the desired output function forbenius( $X , $Y ) { // Solution doesn't exist // if GCD is not 1 if (gcd( $X , $Y ) != 1) { echo "NA\n" ; return ; } // Else apply the formula $A = ( $X * $Y ) - ( $X + $Y ); $N = ( $X - 1) * ( $Y - 1) / 2; echo "Largest Amount = " , $A , "\n" ; echo "Total Count = " , $N , "\n" ; } // Driver Code $X = 2; $Y = 5; forbenius( $X , $Y ); $X = 5; $Y = 10; echo "\n" ; forbenius( $X , $Y ); // This code is contributed by ajit. ?> |
Producción :
Largest Amount = 3 Total Count = 2 NA
Referencias:
https://en.wikipedia.org/wiki/Coin_problem
Este artículo es una contribución de Ashutosh Kumar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA