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++
// 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 minDivisor( 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 divisor 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 minDivisor(N); return 0; } |
Java
// Java program for the above approach import java.io.*; public 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 minDivisor( 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 divisor 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 minDivisor(N); } } // This code is contributed by Rajput-Ji |
Python3
# 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 minDivisor(n): # Check if the number is prime if (prime(n)): print ( 1 , n - 1 ) # Now, if it is not prime then # find the least divisor 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 minDivisor(N) # This code is contributed by mohit kumar 29 |
C#
// 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 minDivisor( 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 divisor 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 minDivisor(N); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // javascript program for the above approach // Function to check if number is // prime or not function 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 = 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 function minDivisor(n) { // Check if the number is prime if (prime(n)) { document.write(1 + " " + (n - 1)); } // Now, if it is not prime then // find the least divisor else { for (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) document.write(n / i + " " + (n / i * (i - 1))); break ; } } } } // Driver Code var N = 4; // Function call minDivisor(N); // This code is contributed by todaysgaurav </script> |
2 2
Time Complexity: O(sqrt(N))
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!