Find four factors of N with maximum product and sum equal to N | Set 3
Given an integer N. The task is to find all factors of N and print the product of four factors of N such that:
- Sum of the four factors is equal to N.
- The product of the four factors is maximum.
If it is not possible to find 4 such factors then print “Not possible”.
Note: All the four factors can be equal to each other to maximize the product and there can be a large number of queries.
Examples:
Input: 24 Output: Product -> 1296 All factors are -> 1 2 3 4 6 8 12 24 Choose the factor 6 four times, Therefore, 6+6+6+6 = 24 and product is maximum. Input: 100 Output: Product -> 390625 All the factors are -> 1 2 4 5 10 10 20 25 50 100 Choose the factor 25 four times.
The idea is to find factors of all numbers from 1 to N ( which is the maximum value of n ).
- An answer will be Not possible if the given
is prime.
- And if the given n is divisible by 4 then answer will be pow(q, 4) where q is a quotient when n is divided by 4.
- If it is possible to find the answer then, the answer must include third last factor two times. And run a nested loop for other two factors.
Below is the implementation of the above approach:
C++
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std; // Function to find primes bool isPrime( int n) { // Corner cases if (n <= 1) return false ; if (n <= 3) return true ; // This is checked so that we can skip // middle five numbers in below loop if (n % 2 == 0 || n % 3 == 0) return false ; for ( int i = 5; i * i <= n; i = i + 6) if (n % i == 0 || n % (i + 2) == 0) return false ; return true ; } // Function to find factors void factors( int N, vector< int >& v[]) { for ( int i = 2; i < N; i++) { // run a loop upto square root of that number for ( int j = 1; j * j <= i; j++) { if (i % j == 0) { // if the n is perfect square if (i / j == j) v[i].push_back(j); // otherwise push it's two divisors else { v[i].push_back(j); v[i].push_back(i / j); } } } // sort the divisors sort(v[i].begin(), v[i].end()); } } // Function to find max product int product( int n) { // To store factors of 'n' vector< int > v[n + 100]; // find factors factors(n + 100, v); // if it is divisible by 4. if (n % 4 == 0) { int x = n / 4; x *= x; return x * x; } else { // if it is prime if (isPrime[n]) return -1; // otherwise answer will be possible else { int ans = -1; if (v[n].size() > 2) { // include last third factor int fac = v[n][v[n].size() - 3]; // nested loop to find other two factors for ( int i = v[n].size() - 1; i >= 0; i--) { for ( int j = v[n].size() - 1; j >= 0; j--) { if ((fac * 2) + (v[n][j] + v[n][i]) == n) ans = max(ans, fac * fac * v[n][j] * v[n][i]); } } return ans; } } } } // Driver code int main() { int n = 24; // function call cout << product(n); return 0; } |
Java
// Java implementation of above approach import java.util.*; import java.lang.*; import java.io.*; class GFG { // Function to find primes static boolean isPrime( int n) { // Corner cases if (n <= 1 ) return false ; if (n <= 3 ) return true ; // This is checked so that we can skip // middle five numbers in below loop if (n % 2 == 0 || n % 3 == 0 ) return false ; for ( int i = 5 ; i * i <= n; i = i + 6 ) if (n % i == 0 || n % (i + 2 ) == 0 ) return false ; return true ; } static Vector<Vector<Integer> > v = new Vector<Vector<Integer> >(); // Function to find factors static void factors( int N ) { for ( int i = 2 ; i < N; i++) { // run a loop upto square root of that number for ( int j = 1 ; j * j <= i; j++) { if (i % j == 0 ) { // if the n is perfect square if (i / j == j) v.get(i).add(j); // otherwise push it's two divisors else { v.get(i).add(j); v.get(i).add(i / j); } } } // sort the divisors Collections.sort(v.get(i)); } } // Function to find max product static int product( int n) { // To store factors of 'n' v.clear(); for ( int i = 0 ; i < n + 100 ; i++) v.add( new Vector<Integer>()); // find factors factors(n + 100 ); // if it is divisible by 4. if (n % 4 == 0 ) { int x = n / 4 ; x *= x; return x * x; } else { // if it is prime if (isPrime(n)) return - 1 ; // otherwise answer will be possible else { int ans = - 1 ; if (v.get(n).size() > 2 ) { // include last third factor int fac = v.get(n).get(v.get(n).size() - 3 ); // nested loop to find other two factors for ( int i = v.get(n).size() - 1 ; i >= 0 ; i--) { for ( int j = v.get(n).size() - 1 ; j >= 0 ; j--) { if ((fac * 2 ) + (v.get(n).get(j) + v.get(n).get(i)) == n) ans = Math.max(ans, fac * fac * v.get(n).get(j) * v.get(n).get(i)); } } return ans; } } } return 0 ; } // Driver code public static void main(String args[]) { int n = 24 ; // function call System.out.println( product(n)); } } // This code is contributed by Arnab Kundu |
Python3
# Python3 implementation of above approach from math import sqrt, ceil, floor # Function to find primes def isPrime(n): # Corner cases if (n < = 1 ): return False if (n < = 3 ): return True # This is checked so that we can skip # middle five numbers in below loop if (n % 2 = = 0 or n % 3 = = 0 ): return False for i in range ( 5 , ceil(sqrt(n)), 6 ): if (n % i = = 0 or n % (i + 2 ) = = 0 ): return False return True # Function to find factors def factors(N, v): for i in range ( 2 , N): # run a loop upto square root of that number for j in range ( 1 ,ceil(sqrt(i)) + 1 ): if (i % j = = 0 ): # if the n is perfect square if (i / / j = = j): v[i].append(j) # otherwise push it's two divisors else : v[i].append(j) v[i].append(i / / j) # sort the divisors v = sorted (v) # Function to find max product def product(n): # To store factors of 'n' v = [[]] * (n + 100 ) # find factors factors(n + 100 , v) # if it is divisible by 4. if (n % 4 = = 0 ): x = n / / 4 x * = x return x * x else : # if it is prime if (isPrime[n]): return - 1 # otherwise answer will be possible else : ans = - 1 if ( len (v[n]) > 2 ): # include last third factor fac = v[n][ len (v[n]) - 3 ] # nested loop to find other two factors for i in range ( len (v[n] - 1 ), - 1 , - 1 ): for j in range ( len (v[n] - 1 ), - 1 , - 1 ): if ((fac * 2 ) + (v[n][j] + v[n][i]) = = n): ans = max (ans, fac * fac * v[n][j] * v[n][i]) return ans # Driver code n = 24 # function call print (product(n)) # This code is contributed by mohit kumar 29 |
C#
// C# implementation of above approach using System; using System.Collections.Generic; class GFG { // Function to find primes static bool isPrime( int n) { // Corner cases if (n <= 1) return false ; if (n <= 3) return true ; // This is checked so that we can skip // middle five numbers in below loop if (n % 2 == 0 || n % 3 == 0) return false ; for ( int i = 5; i * i <= n; i = i + 6) if (n % i == 0 || n % (i + 2) == 0) return false ; return true ; } static List<List< int > > v = new List<List< int > >(); // Function to find factors static void factors( int N ) { for ( int i = 2; i < N; i++) { // run a loop upto square root of that number for ( int j = 1; j * j <= i; j++) { if (i % j == 0) { // if the n is perfect square if (i / j == j) v[i].Add(j); // otherwise push it's two divisors else { v[i].Add(j); v[i].Add(i / j); } } } // sort the divisors v[i].Sort(); } } // Function to find max product static int product( int n) { // To store factors of 'n' v.Clear(); for ( int i = 0; i < n + 100; i++) v.Add( new List< int >()); // find factors factors(n + 100); // if it is divisible by 4. if (n % 4 == 0) { int x = n / 4; x *= x; return x * x; } else { // if it is prime if (isPrime(n)) return -1; // otherwise answer will be possible else { int ans = -1; if (v[n].Count > 2) { // include last third factor int fac = v[n][v[n].Count - 3]; // nested loop to find other two factors for ( int i = v[n].Count - 1; i >= 0; i--) { for ( int j = v[n].Count - 1; j >= 0; j--) { if ((fac * 2) + (v[n][j] + v[n][i]) == n) ans = Math.Max(ans, fac * fac * v[n][j] * v[n][i]); } } return ans; } } } return 0; } // Driver code public static void Main(String []args) { int n = 24; // function call Console.WriteLine( product(n)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // Javascript implementation of above approach // Function to find primes function isPrime(n) { // Corner cases if (n <= 1) return false ; if (n <= 3) return true ; // This is checked so that we can skip // middle five numbers in below loop if (n % 2 == 0 || n % 3 == 0) return false ; for (let i = 5; i * i <= n; i = i + 6) if (n % i == 0 || n % (i + 2) == 0) return false ; return true ; } // Function to find factors function factors(N, v) { for (let i = 2; i < N; i++) { // run a loop upto square root of that number for (let j = 1; j * j <= i; j++) { if (i % j == 0) { // if the n is perfect square if (i / j == j) v[i].push(j); // otherwise push it's two divisors else { v[i].push(j); v[i].push(i / j); } } } // sort the divisors v.sort((a, b) => a - b); } } // Function to find max product function product(n) { // To store factors of 'n' let v = new Array(); for (let i = 0; i < n + 100; i++) { v.push( new Array()) } // find factors factors(n + 100, v); // if it is divisible by 4. if (n % 4 == 0) { let x = n / 4; x *= x; return x * x; } else { // if it is prime if (isPrime[n]) return -1; // otherwise answer will be possible else { let ans = -1; if (v[n].length > 2) { // include last third factor let fac = v[n][v[n].length - 3]; // nested loop to find other two factors for (let i = v[n].length - 1; i >= 0; i--) { for (let j = v[n].length - 1; j >= 0; j--) { if ((fac * 2) + (v[n][j] + v[n][i]) == n) ans = Math.max(ans, fac * fac * v[n][j] * v[n][i]); } } return ans; } } } } // Driver code let n = 24; // function call document.write(product(n)); // This code is contributed by _saurabh_jaiswal </script> |
Output:
1296
Time Complexity: O(n2)
Auxiliary Space: O(n2)
Please Login to comment...