Given an integer N, the task is to find two integers with minimum possible sum such that their product is strictly greater than N.
Examples:
Input: N = 10
Output: 7
Explanation: The integers are 3 and 4. Their product is 3 × 4 = 12, which is greater than N.Input: N = 1
Output: 3
Explanation: The integers are 1 and 2. Their product is 1 × 2 = 2, which is greater than N.
Naive Approach: Let the required numbers be A and B. The idea is based on the observation that in order to minimize their sum A should be the smallest number greater than √N. Once A is found, B will be equal to the smallest number for which A×B > N, which can be found linearly.
Steps to implement-
- Declare two variables first and second to store the answer
- Find the square root of the given number
- The first number will be that integer which is just greater than the square root
- Find the second number by running a loop
- In the last print the sum of the first and the second number
Code-
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the minimum sum of // two integers such that their product // is strictly greater than N void minSum( int N) { //To store first and second number int first,second; //Finding square root of given number float root= sqrt (N); int sq_root=( int )root; //First number will be that integer which //is just greater than square root of N first=sq_root+1; //Finding second number for ( int i=1;i<=N;i++){ if ((first*i)>N){ second=i; break ; } } //Printing their sum cout<<first+second<<endl; } // Driver Code int main() { int N = 10; // Function Call minSum(N); return 0; } |
Java
// Java program for the above approach import java.util.*; public class GFG { // Function to find the minimum sum of // two integers such that their product // is strictly greater than N static void minSum( int N) { // To store first and second number int first, second = 0 ; // Finding square root of given number double root = Math.sqrt(N); int sq_root = ( int )Math.ceil(root); // First number will be that integer which // is just greater than or equal to the square root // of N first = sq_root; // Finding second number for ( int i = 1 ; i <= N; i++) { if ((first * i) > N) { second = i; break ; } } // Printing their sum System.out.println(first + second); } // Driver Code public static void main(String[] args) { int N = 10 ; // Function Call minSum(N); } } |
Javascript
//JavaScript program for the above approach // Function to find the minimum sum of // two integers such that their product // is strictly greater than N function minSum(N) { //To store first and second number let first,second; //Finding square root of given number let root=Math.sqrt(N); let sq_root=Math.floor(root); //First number will be that integer which //is just greater than square root of N first=sq_root+1; //Finding second number for (let i=1;i<=N;i++){ if ((first*i)>N){ second=i; break ; } } //Printing their sum console.log(first+second); } // Driver Code let N = 10; // Function Call minSum(N); |
Output-
7
Time Complexity: O(N)+O(logN)=O(N),O(N) in loop and O(logN) in finding square root
Auxiliary Space: O(1), because no extra space has been used
Efficient Approach: The above solution can be optimized by using Binary Search to find A and B. Follow the steps below to solve the problem:
- Initialize two variables low = 0 and high = 109.
- Iterate until (high – low) is greater than 1 and do the following:
- Find the value of middle-range mid as (low + high)/2.
- Now, compare √N with the middle element mid, and if √N is less than or equal to the middle element, then high as mid.
- Else, update low as mid.
- After all the above steps set A = high.
- Repeat the same procedure to find B such that A×B > N.
- After the above steps, print the sum of A and B as the result.
Below is the implementation of the above approach:
C++14
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; #define ll long long int // Function to find the minimum sum of // two integers such that their product // is strictly greater than N void minSum( int N) { // Initialise low as 0 and // high as 1e9 ll low = 0, high = 1e9; // Iterate to find the first number while (low + 1 < high) { // Find the middle value ll mid = low + (high - low) / 2; // If mid^2 is greater than // equal to A, then update // high to mid if (mid * mid >= N) { high = mid; } // Otherwise update low else { low = mid; } } // Store the first number ll first = high; // Again, set low as 0 and // high as 1e9 low = 0; high = 1e9; // Iterate to find the second number while (low + 1 < high) { // Find the middle value ll mid = low + (high - low) / 2; // If first number * mid is // greater than N then update // high to mid if (first * mid > N) { high = mid; } // Else, update low to mid else { low = mid; } } // Store the second number ll second = high; // Print the result cout << first + second; } // Driver Code int main() { int N = 10; // Function Call minSum(N); return 0; } |
Java
// Java program for the above approach import java.io.*; class GFG{ // Function to find the minimum sum of // two integers such that their product // is strictly greater than N static void minSum( int N) { // Initialise low as 0 and // high as 1e9 long low = 0 , high = 1000000000 ; // Iterate to find the first number while (low + 1 < high) { // Find the middle value long mid = low + (high - low) / 2 ; // If mid^2 is greater than // equal to A, then update // high to mid if (mid * mid >= N) { high = mid; } // Otherwise update low else { low = mid; } } // Store the first number long first = high; // Again, set low as 0 and // high as 1e9 low = 0 ; high = 1000000000 ; // Iterate to find the second number while (low + 1 < high) { // Find the middle value long mid = low + (high - low) / 2 ; // If first number * mid is // greater than N then update // high to mid if (first * mid > N) { high = mid; } // Else, update low to mid else { low = mid; } } // Store the second number long second = high; // Print the result System.out.println(first + second); } // Driver Code public static void main(String[] args) { int N = 10 ; // Function Call minSum(N); } } // This code is contributed by Dharanendra L V |
Python3
# Python3 program for the above approach # Function to find the minimum sum of # two integers such that their product # is strictly greater than N def minSum(N): # Initialise low as 0 and # high as 1e9 low = 0 high = 1000000000 # Iterate to find the first number while (low + 1 < high): # Find the middle value mid = low + (high - low) / 2 # If mid^2 is greater than # equal to A, then update # high to mid if (mid * mid > = N): high = mid # Otherwise update low else : low = mid # Store the first number first = high # Again, set low as 0 and # high as 1e9 low = 0 high = 1000000000 # Iterate to find the second number while (low + 1 < high): # Find the middle value mid = low + (high - low) / 2 # If first number * mid is # greater than N then update # high to mid if (first * mid > N): high = mid # Else, update low to mid else : low = mid # Store the second number second = high # Print the result print ( round (first + second)) # Driver Code N = 10 # Function Call minSum(N) # This code is contributed by Dharanendra L V |
C#
// C# program for the above approach using System; class GFG{ // Function to find the minimum sum of // two integers such that their product // is strictly greater than N static void minSum( int N) { // Initialise low as 0 and // high as 1e9 long low = 0, high = 1000000000; // Iterate to find the first number while (low + 1 < high) { // Find the middle value long mid = low + (high - low) / 2; // If mid^2 is greater than // equal to A, then update // high to mid if (mid * mid >= N) { high = mid; } // Otherwise update low else { low = mid; } } // Store the first number long first = high; // Again, set low as 0 and // high as 1e9 low = 0; high = 1000000000; // Iterate to find the second number while (low + 1 < high) { // Find the middle value long mid = low + (high - low) / 2; // If first number * mid is // greater than N then update // high to mid if (first * mid > N) { high = mid; } // Else, update low to mid else { low = mid; } } // Store the second number long second = high; // Print the result Console.WriteLine( first + second); } // Driver Code static public void Main() { int N = 10; // Function Call minSum(N); } } // This code is contributed by Dharanendra L V |
Javascript
<script> // Javascript program for the above approach // Function to find the minimum sum of // two integers such that their product // is strictly greater than N function minSum(N) { // Initialise low as 0 and // high as 1e9 let low = 0, high = 1000000000; // Iterate to find the first number while (low + 1 < high) { // Find the middle value let mid = low + parseInt((high - low) / 2); // If mid^2 is greater than // equal to A, then update // high to mid if (mid * mid >= N) { high = mid; } // Otherwise update low else { low = mid; } } // Store the first number let first = high; // Again, set low as 0 and // high as 1e9 low = 0; high = 1000000000; // Iterate to find the second number while (low + 1 < high) { // Find the middle value let mid = low + parseInt((high - low) / 2); // If first number * mid is // greater than N then update // high to mid if (first * mid > N) { high = mid; } // Else, update low to mid else { low = mid; } } // Store the second number let second = high; // Print the result document.write(first + second); } // Driver Code let N = 10; // Function Call minSum(N); // This code is contributed by rishavmahato348. </script> |
7
Time Complexity: O(log N)
Auxiliary Space: O(1)
Most Efficient Approach: To optimize the above approach, the idea is based on Inequality of Arithmetic and Geometric progression as illustrated below.
From the inequality, If there are two integers A and B,
(A + B)/2 ≥ √(A×B)
Now, A×B = Product of the two integers, which is N and A+B is sum(=S).
Therefore, S ≥ 2*√N
To get strictly greater product than N, the above equation transforms to: S ≥ 2*√(N+1)
Below is the program for the above approach:
C++14
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the minimum sum of // two integers such that their product // is strictly greater than N void minSum( int N) { // Store the answer using the // AP-GP inequality int ans = ceil (2 * sqrt (N + 1)); // Print the answer cout << ans; } // Driver Code int main() { int N = 10; // Function Call minSum(N); return 0; } |
Java
// Java program for the above approach import java.lang.*; class GFG{ // Function to find the minimum sum of // two integers such that their product // is strictly greater than N static void minSum( int N) { // Store the answer using the // AP-GP inequality int ans = ( int )Math.ceil( 2 * Math.sqrt(N + 1 )); // Print the answer System.out.println( ans); } // Driver Code public static void main(String[] args) { int N = 10 ; // Function Call minSum(N); } } // This code is contributed by Dharanendra L V |
Python3
# Python3 program for the above approach import math # Function to find the minimum sum of # two integers such that their product # is strictly greater than N def minSum(N): # Store the answer using the # AP-GP inequality ans = math.ceil( 2 * math.sqrt(N + 1 )) # Print the result print (math.trunc(ans)) # Driver Code N = 10 # Function Call minSum(N) # This code is contributed by Dharanendra L V |
C#
// C# program for the above approach using System; class GFG{ // Function to find the minimum sum of // two integers such that their product // is strictly greater than N static void minSum( int N) { // Store the answer using the // AP-GP inequality int ans = ( int )Math.Ceiling(2 * Math.Sqrt(N + 1)); // Print the answer Console.WriteLine( ans); } // Driver Code static public void Main() { int N = 10; // Function Call minSum(N); } } // This code is contributed by Dharanendra L V |
Javascript
<script> // Javascript program for the above approach // Function to find the minimum sum of // two integers such that their product // is strictly greater than N function minSum(N) { // Store the answer using the // AP-GP inequality let ans = Math.ceil(2 * Math.sqrt(N + 1)); // Print the answer document.write(ans); } // Driver Code let N = 10; // Function Call minSum(N); </script> |
7
Time Complexity: O(logN) because it is using inbuilt sqrt function
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!