Encuentra el mínimo x tal que (x % k) * (x / k) == n – Part 1

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>
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *