Divida N en K partes únicas de manera que el mcd de esas partes sea máximo

Dado un entero positivo N , la tarea es dividirlo en K partes únicas de manera que la suma de estas partes sea igual al número original y el mcd de todas las partes sea máximo. Imprime el gcd máximo si existe tal división; de lo contrario, imprime -1 .
 

Ejemplos: 

Entrada: N = 6, K = 3 
Salida: 1  Las
únicas divisiones posibles con 
elementos únicos son (1, 2, 3) y mcd(1, 2, 3) = 1.
Entrada: N = 18, K = 3 
Salida:

Enfoque ingenuo: encuentre todas las divisiones posibles de N y calcule el gcd máximo de ellas. Pero este enfoque tomará un tiempo y un espacio exponenciales.
Enfoque eficiente: Sean las divisiones de N A 1 , A 2 ……..A K 
Ahora, se sabe que mcd(a, b) = mcd(a, b, a + b) y por lo tanto, mcd(A 1 , A 2 ….A K ) = mcd(A 1 , A 2 ….A K , A 1 + A 2 …. + A K ) 
Pero A 1 + A 2…. + A K = N y por tanto, el mcd de las divisiones será uno de los factores de N
Sea a el factor de N que puede ser la posible respuesta: 
Como a es el mcd, todas las divisiones serán múltiplos de a y por lo tanto, para K único B i
a * B 1 + a * B 2 ……. + a * B K = N  
a * (B 1 + B 2 …….+ B K ) = N 
Como todos los B i son únicos, 
B 1+ B 2 …….+ B K ≥ 1 + 2 + 3 ….. + K  
B 1 + B 2 …….+ B K ≥ K * (K + 1) / 2 
Por lo tanto, todos los factores de N cuyo complementario factor es mayor o igual a K * (K + 1) / 2 puede ser una de las posibles respuestas, y hemos llevado al máximo de todas las posibles respuestas.

A continuación se muestra la implementación del enfoque anterior: 

CPP

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate maximum GCD
int maxGCD(int N, int K)
{
 
    // Minimum possible sum for
    // K unique positive integers
    int minSum = (K * (K + 1)) / 2;
 
    // It is not possible to divide
    // N into K unique parts
    if (N < minSum)
        return -1;
 
    // All the factors greater than sqrt(N)
    // are complementary of the factors less
    // than sqrt(N)
    int i = sqrt(N);
    int res = 1;
    while (i >= 1) {
 
        // If i is a factor of N
        if (N % i == 0) {
            if (i >= minSum)
                res = max(res, N / i);
 
            if (N / i >= minSum)
                res = max(res, i);
        }
        i--;
    }
 
    return res;
}
 
// Driver code
int main()
{
    int N = 18, K = 3;
 
    cout << maxGCD(N, K);
 
    return 0;
}

Java

// Java implementation of the approach
import java.io.*;
import java.lang.Math;
 
class GFG
{
    // Function to calculate maximum GCD
    static int maxGCD(int N, int K)
    {
 
        // Minimum possible sum for
        // K unique positive integers
        int minSum = (K * (K + 1)) / 2;
 
        // It is not possible to divide
        // N into K unique parts
        if (N < minSum)
            return -1;
 
        // All the factors greater than sqrt(N)
        // are complementary of the factors less
        // than sqrt(N)
        int i = (int) Math.sqrt(N);
        int res = 1;
        while (i >= 1)
        {
 
            // If i is a factor of N
            if (N % i == 0)
            {
                if (i >= minSum)
                    res = Math.max(res, N / i);
 
                if (N / i >= minSum)
                    res = Math.max(res, i);
            }
            i--;
        }
 
        return res;
    }
 
    // Driver code
    public static void main (String[] args)
    {
        int N = 18, K = 3;
 
        System.out.println(maxGCD(N, K));
    }
}
 
// This code is contributed by ApurvaRaj

Python

# Python3 implementation of the approach
from math import sqrt,ceil,floor
 
# Function to calculate maximum GCD
def maxGCD(N, K):
 
    # Minimum possible sum for
    # K unique positive integers
    minSum = (K * (K + 1)) / 2
 
    # It is not possible to divide
    # N into K unique parts
    if (N < minSum):
        return -1
 
    # All the factors greater than sqrt(N)
    # are complementary of the factors less
    # than sqrt(N)
    i = ceil(sqrt(N))
    res = 1
    while (i >= 1):
 
        # If i is a factor of N
        if (N % i == 0):
            if (i >= minSum):
                res = max(res, N / i)
 
            if (N / i >= minSum):
                res = max(res, i)
 
        i-=1
 
    return res
 
# Driver code
 
N = 18
K = 3
 
print(maxGCD(N, K))
 
# This code is contributed by mohit kumar 29

C#

// C# implementation of the approach
using System;
 
class GFG
{
    // Function to calculate maximum GCD
    static int maxGCD(int N, int K)
    {
 
        // Minimum possible sum for
        // K unique positive integers
        int minSum = (K * (K + 1)) / 2;
 
        // It is not possible to divide
        // N into K unique parts
        if (N < minSum)
            return -1;
 
        // All the factors greater than sqrt(N)
        // are complementary of the factors less
        // than sqrt(N)
        int i = (int) Math.Sqrt(N);
        int res = 1;
        while (i >= 1)
        {
 
            // If i is a factor of N
            if (N % i == 0)
            {
                if (i >= minSum)
                    res = Math.Max(res, N / i);
 
                if (N / i >= minSum)
                    res = Math.Max(res, i);
            }
            i--;
        }
        return res;
    }
 
    // Driver code
    public static void Main()
    {
        int N = 18, K = 3;
 
        Console.WriteLine(maxGCD(N, K));
    }
}
 
// This code is contributed by AnkitRai01

Javascript

<script>
// javascript implementation of the approach
 
    // Function to calculate maximum GCD
    function maxGCD(N , K) {
 
        // Minimum possible sum for
        // K unique positive integers
        var minSum = (K * (K + 1)) / 2;
 
        // It is not possible to divide
        // N into K unique parts
        if (N < minSum)
            return -1;
 
        // All the factors greater than sqrt(N)
        // are complementary of the factors less
        // than sqrt(N)
        var i = parseInt( Math.sqrt(N));
        var res = 1;
        while (i >= 1) {
 
            // If i is a factor of N
            if (N % i == 0) {
                if (i >= minSum)
                    res = Math.max(res, N / i);
 
                if (N / i >= minSum)
                    res = Math.max(res, i);
            }
            i--;
        }
 
        return res;
    }
 
    // Driver code
     
        var N = 18, K = 3;
 
        document.write(maxGCD(N, K));
 
// This code contributed by Rajput-Ji
</script>
Producción: 

3

 

Complejidad de tiempo: O(N 1/2 )

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por AshaRamMeena 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 *