Open In App

Maximum factors formed by two numbers

Given a list of N numbers, Find two numbers such that the product of the two numbers has the maximum number of factors. Formally given n numbers a0, a1, a2, …..an. We are required to find two numbers ai and aj such that their multiplication gives the maximum number of factors and return number of factors of ai * aj Constraints 1 <= N <=100 1 <= ai <= 10^8 Examples:

Input : [4, 3, 8] 
Output : 8
3*4 = 12 which has 6 factors
3*8 = 24 which has 8 factors
4*8 = 32 which has 6 factors
for ai, aj = {3, 8} we have the 
maximum number of factors 8 

One simple approach seems to be to take two numbers with maximum prime factors. This approach might not work as the picked two numbers may have many common factors and their product might not have maximum factors. For example, in [4, 3, 8], (4, 8) is not answer, but 3, 8 is answer. We consider every pair of numbers. For every pair, we find union of factors and finally return the pair which has maximum count in union. 






// C++ program to find the pair whose
// product has maximum factors.
#include <bits/stdc++.h>
using namespace std;
 
typedef unordered_map<int,int> u_map;
 
// Returns a map that has counts of individual
// factors in v[]
u_map countMap(vector<int> v)
{
    u_map map;
    for (size_t i = 0; i < v.size(); i++)
        if (map.find(v[i]) != map.end())
            map[v[i]]++;       
        else
            map.insert({v[i], 1});       
    return map;
}
 
// Given two Numbers in the form of their
// prime factorized maps. Returns total
// number of factors of the product of
// those two numbers
int totalFactors(u_map m1, u_map m2)
{
    // Find union of all factors.
    for (auto it = m2.begin(); it != m2.end(); ++it) {
        if (m1.find(it->first) != m1.end())
            m1[it->first] += it->second;       
        else
            m1.insert({ it->first, it->second });       
    }
 
    int product = 1;
    for (auto it = m1.begin(); it != m1.end(); it++)
        product *= (it->second + 1);
     
    return product;
}
 
// Prime factorization of a number is represented
// as an Unordered map
u_map primeFactorize(int n)
{
    vector<int> pfac;
    int temp = 2;
    while (temp * temp <= n) {
        if (n % temp == 0) {
            pfac.push_back(temp);
            n = n / temp;
        }
        else {
            temp++;
        }
    }
    if (n > 1)
        pfac.push_back(n);
     
    return countMap(pfac);
}
 
int maxProduct(int arr[], int n)
{
    // vector containing of prime factorizations
    // of every number in the array. Every element
    // of vector contains factors and their counts.
    vector<u_map> vum;
    for (int i = 0; i < n; i++)
        vum.push_back(primeFactorize(arr[i]));
     
    // Consider every pair and find the pair with
    // maximum factors.
    int maxp = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j)
                continue;
            maxp = max(maxp,
                  totalFactors(vum[i], vum[j]));
        }
    }
    return maxp;
}
 
// Driver code
int main()
{
    int arr[] = { 4, 3, 8 };
    cout << maxProduct(arr, 3);
    return 0;
}




import java.util.*;
 
public class GFG
{
 
  // Java program to find the pair whose
  // product has maximum factors.
  // C++ TO JAVA CONVERTER WARNING: The following #include
  // directive was ignored: #include <bits/stdc++.h>
 
  // Returns a map that has counts of individual
  // factors in v[]
  public static HashMap<Integer, Integer>
    countMap(ArrayList<Integer> v)
  {
    HashMap<Integer, Integer> map
      = new HashMap<Integer, Integer>();
    for (int i = 0; i < v.size(); i++) {
      if (map.containsKey(v.get(i))) {
        map.put(v.get(i), map.get(v.get(i)) + 1);
      }
      else {
        map.put(v.get(i), 1);
      }
    }
    return map;
  }
 
  // Given two Numbers in the form of their
  // prime factorized maps. Returns total
  // number of factors of the product of
  // those two numbers
  public static int
    totalFactors(HashMap<Integer, Integer> m1,
                 HashMap<Integer, Integer> m2)
  {
 
    // Find union of all factors.
    for (Map.Entry it : m2.entrySet()) {
      int key = (int)it.getKey();
      int value = (int)it.getValue();
      if (m1.containsKey(key)) {
        m1.put(key, m1.get(key) + value);
      }
      else {
        m1.put(key, value);
      }
    }
 
    int product = 1;
    for (Map.Entry it : m1.entrySet()) {
      product *= ((int)it.getValue() + 1);
    }
 
    return product;
  }
 
  // Prime factorization of a number is represented
  // as an Unordered map
  public static HashMap<Integer, Integer>
    primeFactorize(int n)
  {
    ArrayList<Integer> pfac = new ArrayList<Integer>();
    int temp = 2;
    while (temp * temp <= n) {
      if (n % temp == 0) {
        pfac.add(temp);
        n = n / temp;
      }
      else {
        temp++;
      }
    }
    if (n > 1) {
      pfac.add(n);
    }
 
    return countMap(pfac);
  }
 
  public static int maxProduct(int[] arr, int n)
  {
 
    // vector containing of prime factorizations
    // of every number in the array. Every element
    // of vector contains factors and their counts.
    ArrayList<HashMap<Integer, Integer> > vum
      = new ArrayList<HashMap<Integer, Integer> >();
    for (int i = 0; i < n; i++) {
      vum.add(primeFactorize(arr[i]));
    }
 
    // Consider every pair and find the pair with
    // maximum factors.
    int maxp = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i == j) {
          continue;
        }
        maxp = Math.max(
          maxp,
          totalFactors(vum.get(i), vum.get(j)));
      }
    }
    return maxp%10;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int[] arr = { 4, 3, 8 };
    System.out.print(maxProduct(arr, 3));
  }
}
 
// The code is contributed by Aarti_Rathi




# Python program to find the pair whose
# product has maximum factors.
from collections import Counter
 
# Returns list of factors of n.
def prime_factorize(n):
    primfac = []
    d = 2
    while d * d <= n:
        while (n % d) == 0:
            primfac.append(d) 
            n //= d
        d += 1
    if n > 1:
       primfac.append(n)
    return Counter(primfac)
 
# Returns total factors in c1 and c2
def total_factors(c1, c2):
       
    c = c1 + c2
    v = c.values()
 
    # calc product of each element + 1
    p = 1
    for i in v:
        p *=(i + 1)
    return p
 
def max_product(arr):
    n = len(arr)
 
    # Loop through all the nc2 possibilities
    pfac = []
    for i in arr:
        pfac.append(prime_factorize(i))
    maxp = 0
    for i, v1 in enumerate(arr):
        for j, v2 in enumerate(arr):
            if i == j:
                continue
            p = total_factors(pfac[i], pfac[j])
            if(p>maxp):
                maxp = p
    return maxp
 
if __name__ == '__main__':
    print max_product([4, 8, 3])




// C# program to find the pair whose
// product has maximum factors.
using System;
using System.Collections.Generic;
 
public class GFG {
 
  // Returns a map that has counts of individual
  // factors in v[]
  public static Dictionary<int, int> countMap(List<int> v)
  {
    Dictionary<int, int> map
      = new Dictionary<int, int>();
    for (int i = 0; i < v.Count; i++) {
      if (map.ContainsKey(v[i])) {
        map[v[i]]++;
      }
      else {
        map[v[i]] = 1;
      }
    }
    return map;
  }
 
  // Given two Numbers in the form of their
  // prime factorized maps. Returns total
  // number of factors of the product of
  // those two numbers
  public static int totalFactors(Dictionary<int, int> m1,
                                 Dictionary<int, int> m2)
  {
 
    // Find union of all factors.
    foreach(var it in m2)
    {
      int key = (int)it.Key;
      int value = (int)it.Value;
      if (m1.ContainsKey(key)) {
        m1[key] += value;
      }
      else {
        m1[key] = value;
      }
    }
 
    int product = 1;
    foreach(var it in m1)
    {
      product *= ((int)it.Value + 1);
    }
 
    return product;
  }
 
  // Prime factorization of a number is represented
  // as an Unordered map
  public static Dictionary<int, int> primeFactorize(int n)
  {
    List<int> pfac = new List<int>();
    int temp = 2;
    while (temp * temp <= n) {
      if (n % temp == 0) {
        pfac.Add(temp);
        n = n / temp;
      }
      else {
        temp++;
      }
    }
    if (n > 1) {
      pfac.Add(n);
    }
 
    return countMap(pfac);
  }
 
  public static int maxProduct(int[] arr, int n)
  {
 
    // vector containing of prime factorizations
    // of every number in the array. Every element
    // of vector contains factors and their counts.
    List<Dictionary<int, int> > vum
      = new List<Dictionary<int, int> >();
    for (int i = 0; i < n; i++) {
      vum.Add(primeFactorize(arr[i]));
    }
 
    // Consider every pair and find the pair with
    // maximum factors.
    int maxp = 0;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i == j) {
          continue;
        }
        maxp = Math.Max(
          maxp, totalFactors(vum[i], vum[j]));
      }
    }
    return maxp % 10;
  }
 
  // Driver code
  public static void Main(string[] args)
  {
    int[] arr = { 4, 3, 8 };
    Console.Write(maxProduct(arr, 3));
  }
}
 
// The code is contributed by phasing17




// JavaScript program to find the pair whose
// product has maximum factors.
 
// Returns a map that has counts of individual
// factors in v[]
function countMap(v)
{
    let map = new Map();
    for (let i = 0; i < v.length; i++)
        if (map.has(v[i]))
            map.set(v[i], map.get(v[i]) + 1);   
        else
            map.set(v[i], 1);     
    return map;
}
 
// Given two Numbers in the form of their
// prime factorized maps. Returns total
// number of factors of the product of
// those two numbers
function totalFactors(M1, M2)
{
    let m1 = new Map();
    let m2 = new Map();
    for(const [key, value] of M1){
        m1.set(key, value);
    }
    for(const [key, value] of M2){
        m2.set(key, value);
    }
     
     
    // Find union of all factors.
    for(const [key, value] of m2){
        if(m1.has(key.toString())){
            m1.set(key, m1.get(key) + value);
        }
        else{
            m1.set(key, value);
        }
    }
 
    let product = 1;
    for(const [key, value] of m1){
        product = product * (value + 1);
    }
     
    return product;
}
 
// Prime factorization of a number is represented
// as an Unordered map
function primeFactorize(n)
{
    let pfac = new Array();
    let temp = 2;
    while (temp * temp <= n) {
        if (n % temp == 0) {
            pfac.push(temp);
            n = Math.floor(n / temp);
        }
        else {
            temp = temp + 1;
        }
    }
    if (n > 1)
        pfac.push(n);
     
    return countMap(pfac);
}
 
function maxProduct(arr, n)
{
    // vector containing of prime factorizations
    // of every number in the array. Every element
    // of vector contains factors and their counts.   
    let vum = new Array();
 
    for (let i = 0; i < n; i++){
        vum.push(primeFactorize(arr[i]));
    }
     
    // Consider every pair and find the pair with
    // maximum factors.
    let maxp = 0;
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (i == j){
                continue;
            }            
 
            maxp = Math.max(maxp, totalFactors(vum[i], vum[j]));
        }
    }
    return maxp;
}
 
// Driver code
let arr = [4, 3, 8];
console.log(maxProduct(arr, 3));
 
// The code is contributed by Gautam goel (gautamgoel962)

Output:

8

Time Complexity:  O(n^3log(n))
Auxiliary Space: O(n^2log(n))



An alternate approach is to find LCM of all pairs and find factors in all LCMs. Finally return the pair whose LCM has maximum factors.


Article Tags :