Dados dos enteros positivos n y k. Encuentre el entero positivo mínimo x tal que (x % k) * (x / k) == n, donde % es el operador de módulo y / es el operador de división de enteros.
Ejemplos:
Input : n = 4, k = 6 Output :10 Explanation : (10 % 6) * (10 / 6) = (4) * (1) = 4 which is equal to n Input : n = 5, k = 5 Output : 26
Solución ingenua: un enfoque simple es ejecutar un ciclo while hasta que encontremos una solución que satisfaga la ecuación dada, pero esto sería muy lento.
Solución eficiente: la idea clave aquí es notar que el valor de (x % k) se encuentra en el rango [1, k – 1]. (0 no está incluido, ya que no podemos dividir n por (x % k) cuando es cero). Ahora, necesitamos encontrar el número más grande posible en el rango que divide a n y, por lo tanto, la ecuación dada se convierte en x = (n * k) / (x % k) + (x % k).
Nota: (x % k) se suma a la respuesta ya que para el valor actual del módulo (x % k), no debe contradecirse que por un lado x es tal que el resto al dividir por k es (x % k) y por el otro x es (n * k) / (x % k) cuyo resto es simplemente cero cuando dividimos este valor por k.
A continuación se muestra la implementación del enfoque anterior.
C++
// CPP Program to find the minimum // positive X such that the given // equation holds true #include <bits/stdc++.h> using namespace std; // This function gives the required // answer int minimumX(int n, int k) { int ans = INT_MAX; // Iterate over all possible // remainders for (int rem = k - 1; rem > 0; rem--) { // it must divide n if (n % rem == 0) ans = min(ans, rem + (n / rem) * k); } return ans; } // Driver Code to test above function int main() { int n = 4, k = 6; cout << minimumX(n, k) << endl; n = 5, k = 5; cout << minimumX(n, k) << endl; return 0; }
Java
// Java Program to find the minimum // positive X such that the given // equation holds true class Solution { // This function gives the required // answer static int minimumX(int n, int k) { int ans =Integer.MAX_VALUE; // Iterate over all possible // remainders for (int rem = k - 1; rem > 0; rem--) { // it must divide n if (n % rem == 0) ans = Math.min(ans, rem + (n / rem) * k); } return ans; } // Driver Code to test above function public static void main(String args[]) { int n = 4, k = 6; System.out.println( minimumX(n, k)); n = 5; k = 5; System.out.println(minimumX(n, k)); } } //contributed by Arnab Kundu
Python3
# Python 3 program to find the minimum positive # x such that the given equation holds true # This function gives the required answer def minimumX(n, k): ans = 10 ** 18 # Iterate over all possible remainders for i in range(k - 1, 0, -1): if n % i == 0: ans = min(ans, i + (n / i) * k) return ans # Driver Code n, k = 4, 6 print(minimumX(n, k)) n, k = 5, 5 print(minimumX(n, k)) # This code is contributed # by Mohit Kumar
C#
// C# Program to find the minimum // positive X such that the given // equation holds true using System; public class GFG{ // This function gives the required // answer static int minimumX(int n, int k) { int ans =int.MaxValue; // Iterate over all possible // remainders for (int rem = k - 1; rem > 0; rem--) { // it must divide n if (n % rem == 0) ans = Math.Min(ans, rem + (n / rem) * k); } return ans; } // Driver Code to test above function static public void Main (){ int n = 4, k = 6; Console.WriteLine( minimumX(n, k)); n = 5; k = 5; Console.WriteLine(minimumX(n, k)); } } //This code is contributed by Sachin.
PHP
<?php // PHP Program to find the minimum // positive X such that the given // equation holds true // This function gives the required // answer function minimumX($n, $k) { $ans = PHP_INT_MAX; // Iterate over all possible // remainders for ($rem = $k - 1; $rem > 0; $rem--) { // it must divide n if ($n % $rem == 0) $ans = min($ans, $rem + ($n / $rem) * $k); } return $ans; } // Driver Code $n = 4 ; $k = 6 ; echo minimumX($n, $k), "\n" ; $n = 5 ; $k = 5 ; echo minimumX($n, $k) ; // This code is contributed by Ryuga ?>
Javascript
<script> // Javascript Program to find the minimum // positive X such that the given // equation holds true // This function gives the required // answer function minimumX(n, k) { let ans = Number.MAX_VALUE; // Iterate over all possible // remainders for (let rem = k - 1; rem > 0; rem--) { // it must divide n if (n % rem == 0) ans = Math.min(ans, rem + (n / rem) * k); } return ans; } // Driver code to test above function let n = 4, k = 6; document.write(minimumX(n, k) + "</br>"); n = 5, k = 5; document.write(minimumX(n, k)); </script>
10 26
Complejidad temporal: O(k), donde k es el entero positivo dado.
Espacio Auxiliar: O(1), ya que no se ha ocupado ningún espacio extra.
Publicación traducida automáticamente
Artículo escrito por Nishant Tanwar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA