Find the pair (a, b) with minimum LCM such that their sum is equal to N

Given a number N, the task is to find two numbers a and b such that a + b = N and LCM(a, b) is minimum.

Examples:

Input: N = 15
Output: a = 5, b = 10
Explanation:
The pair 5, 10 has a sum of 15 and their LCM is 10 which is the minimum possible.

Input: N = 4
Output: a = 2, b = 2
Explanation: 
The pair 2, 2 has a sum of 4 and their LCM is 2 which is the minimum possible.

Approach: The idea is to use the concept of GCD and LCM. Below are the steps:

  • If N is a Prime Number then the answer is 1 and N – 1 because in any other cases either a + b > N or LCM( a, b) is > N – 1. This is because if N is prime then it implies that N is odd. So a and b, any one of them must be odd and other even. Therefore, LCM(a, b) must be greater than N ( if not 1 and N – 1) as 2 will always be a factor.
  • If N is not a prime number then choose a, b such that their GCD is maximum, because of the formula LCM(a, b) = a*b / GCD (a, b). So, in order to minimize LCM(a, b) we must maximize GCD(a, b).
  • If x is a divisor of N, then by simple mathematics a and b can be represented as N / x and N / x*( x – 1) respectively. Now as a = N / x and b = N / x * (x – 1), so their GCD comes out as N / x. To maximize this GCD, take the smallest possible x or smallest possible divisor of N.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to check if number is
// prime or not
bool prime(int n)
{
    // As 1 is neither prime
    // nor composite return false
    if (n == 1)
        return false;
  
    // Check if it is divided by any
    // number then it is not prime,
    // return false
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0)
            return false;
    }
  
    // Check if n is not divided
    // by any number then it is
    // prime and hence return true
    return true;
}
  
// Function to find the pair (a, b)
// such that sum is N & LCM is minimum
void minDivisior(int n)
{
  
    // Check if the number is prime
    if (prime(n)) {
        cout << 1 << " " << n - 1;
    }
  
    // Now, if it is not prime then
    // find the least divisior
    else {
        for (int i = 2; i * i <= n; i++) {
  
            // Check if divides n then
            // it is a factor
            if (n % i == 0) {
  
                // Required output is
                // a = n/i & b = n/i*(n-1)
                cout << n / i << " "
                     << n / i * (i - 1);
                break;
            }
        }
    }
}
  
// Driver Code
int main()
{
    int N = 4;
  
    // Function call
    minDivisior(N);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
class GFG{
  
// Function to check if number is
// prime or not
static boolean prime(int n)
{
    // As 1 is neither prime
    // nor composite return false
    if (n == 1)
        return false;
  
    // Check if it is divided by any
    // number then it is not prime,
    // return false
    for (int i = 2; i * i <= n; i++) 
    {
        if (n % i == 0)
            return false;
    }
  
    // Check if n is not divided
    // by any number then it is
    // prime and hence return true
    return true;
}
  
// Function to find the pair (a, b)
// such that sum is N & LCM is minimum
static void minDivisior(int n)
{
  
    // Check if the number is prime
    if (prime(n))
    {
        System.out.print(1 + " " +  (n - 1));
    }
  
    // Now, if it is not prime then
    // find the least divisior
    else 
    {
        for (int i = 2; i * i <= n; i++)
        {
  
            // Check if divides n then
            // it is a factor
            if (n % i == 0
            {
  
                // Required output is
                // a = n/i & b = n/i*(n-1)
                System.out.print(n / i + " " +
                                (n / i * (i - 1)));
                break;
            }
        }
    }
}
  
// Driver Code
public static void main(String[] args)
{
    int N = 4;
  
    // Function call
    minDivisior(N);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Function to check if number is
# prime or not
def prime(n):
      
    # As 1 is neither prime
    # nor composite return false
    if (n == 1):
        return False
  
    # Check if it is divided by any
    # number then it is not prime,
    # return false
    for i in range(2, n + 1):
        if i * i > n:
            break
        if (n % i == 0):
            return False
  
    # Check if n is not divided
    # by any number then it is
    # prime and hence return true
    return True
  
# Function to find the pair (a, b)
# such that sum is N & LCM is minimum
def minDivisior(n):
  
    # Check if the number is prime
    if (prime(n)):
        print(1, n - 1)
  
    # Now, if it is not prime then
    # find the least divisior
    else:
        for i in range(2, n + 1):
            if i * i > n:
                break
  
            # Check if divides n then
            # it is a factor
            if (n % i == 0):
  
                # Required output is
                # a = n/i & b = n/i*(n-1)
                print(n // i, n // i * (i - 1))
                break
  
# Driver Code
N = 4
  
# Function call
minDivisior(N)
  
# This code is contributed by mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
  
class GFG{
  
// Function to check if number is
// prime or not
static bool prime(int n)
{
      
    // As 1 is neither prime
    // nor composite return false
    if (n == 1)
        return false;
  
    // Check if it is divided by any
    // number then it is not prime,
    // return false
    for(int i = 2; i * i <= n; i++) 
    {
        if (n % i == 0)
            return false;
    }
  
    // Check if n is not divided
    // by any number then it is
    // prime and hence return true
    return true;
}
  
// Function to find the pair (a, b)
// such that sum is N & LCM is minimum
static void minDivisior(int n)
{
  
    // Check if the number is prime
    if (prime(n))
    {
        Console.Write(1 + " " + (n - 1));
    }
  
    // Now, if it is not prime then
    // find the least divisior
    else
    {
        for(int i = 2; i * i <= n; i++)
        {
              
            // Check if divides n then
            // it is a factor
            if (n % i == 0) 
            {
                  
                // Required output is
                // a = n/i & b = n/i*(n-1)
                Console.Write(n / i + " " +
                             (n / i * (i - 1)));
                break;
            }
        }
    }
}
  
// Driver Code
public static void Main(String[] args)
{
    int N = 4;
  
    // Function call
    minDivisior(N);
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


Output: 

2 2

Time Complexity: O(sqrt(N))
Auxiliary Space: O(1)

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.