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:

  1. Sum of the four factors is equal to N.
  2. 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 n 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++ 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;
}

Output:

1296


My Personal Notes arrow_drop_up


pawanasipugmailcom

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.