Count number of triplets with product equal to given number

Given an array of distinct integers(considering only positive numbers) and a number ‘m’, find the number of triplets with product equal to ‘m’.
Examples:  

Input : arr[] = { 1, 4, 6, 2, 3, 8}  
            m = 24
Output : 3
{1, 4, 6} {1, 3, 8} {4, 2, 3}

Input : arr[] = { 0, 4, 6, 2, 3, 8}  
            m = 18
Output : 0

Asked in : Microsoft 

A Naive approach is to consider each and every triplet one by one and count if their product is equal to m. 
 

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to count triplets with given
// product m
#include <iostream>
using namespace std;
 
// Function to count such triplets
int countTriplets(int arr[], int n, int m)
{
    int count = 0;
 
    // Consider all triplets and count if
    // their product is equal to m
    for (int i = 0; i < n - 2; i++)
        for (int j = i + 1; j < n - 1; j++)
            for (int k = j + 1; k < n; k++)
                if (arr[i] * arr[j] * arr[k] == m)
                    count++;
 
    return count;
}
 
// Drivers code
int main()
{
    int arr[] = { 1, 4, 6, 2, 3, 8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int m = 24;
 
    cout << countTriplets(arr, n, m);
 
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to count triplets with given
// product m
 
class GFG {
    // Method to count such triplets
    static int countTriplets(int arr[], int n, int m)
    {
        int count = 0;
 
        // Consider all triplets and count if
        // their product is equal to m
        for (int i = 0; i < n - 2; i++)
            for (int j = i + 1; j < n - 1; j++)
                for (int k = j + 1; k < n; k++)
                    if (arr[i] * arr[j] * arr[k] == m)
                        count++;
 
        return count;
    }
 
    // Driver method
    public static void main(String[] args)
    {
        int arr[] = { 1, 4, 6, 2, 3, 8 };
        int m = 24;
 
        System.out.println(countTriplets(arr, arr.length, m));
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to count
# triplets with given product m
 
# Method to count such triplets
def countTriplets(arr, n, m):
     
    count = 0
 
    # Consider all triplets and count if
    # their product is equal to m
    for i in range (n - 2):
        for j in range (i + 1, n - 1):
            for k in range (j + 1, n):
                if (arr[i] * arr[j] * arr[k] == m):
                    count += 1
    return count
 
# Driver code
if __name__ == "__main__":
   
    arr = [1, 4, 6, 2, 3, 8]
    m = 24
    print(countTriplets(arr,
                        len(arr), m))
 
# This code is contributed by Chitranayal
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to count triplets
// with given product m
using System;
 
public class GFG {
     
    // Method to count such triplets
    static int countTriplets(int[] arr, int n, int m)
    {
        int count = 0;
 
        // Consider all triplets and count if
        // their product is equal to m
        for (int i = 0; i < n - 2; i++)
            for (int j = i + 1; j < n - 1; j++)
                for (int k = j + 1; k < n; k++)
                    if (arr[i] * arr[j] * arr[k] == m)
                        count++;
 
        return count;
    }
 
    // Driver method
    public static void Main()
    {
        int[] arr = { 1, 4, 6, 2, 3, 8 };
        int m = 24;
 
        Console.WriteLine(countTriplets(arr, arr.Length, m));
    }
}
 
// This code is contributed by Sam007
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to count triplets
// with given product m
 
// Function to count such triplets
function countTriplets($arr, $n, $m)
{
    $count = 0;
 
    // Consider all triplets and count if
    // their product is equal to m
    for ( $i = 0; $i < $n - 2; $i++)
        for ( $j = $i + 1; $j < $n - 1; $j++)
            for ($k = $j + 1; $k < $n; $k++)
                if ($arr[$i] * $arr[$j] * $arr[$k] == $m)
                    $count++;
 
    return $count;
}
 
    // Driver code
    $arr = array(1, 4, 6, 2, 3, 8);
    $n = sizeof($arr);
    $m = 24;
    echo countTriplets($arr, $n, $m);
 
// This code is contributed by jit_t.
?>
chevron_right

Output: 
 

3





Time Complexity: O(n3)
An Efficient Method is to use Hashing.  



  1. Store all the elements in a hash_map with their index.
  2. Consider all pairs(i, j) and check the following: 
    • If (arr[i]*arr[j] !=0 && (m % arr[i]*arr[j]) == 0), If yes, then search for ( m / (arr[i]*arr[j]) in the map.
    • Also check m / (arr[i]*arr[j]) is not equal to arr[i] and arr[j].
    • Also, check that the current triplet is not counted previously by using the index stored in the map.
    • If all the above conditions are satisfied, then increment the count.
  3. Return count.
filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to count triplets with given
// product m
#include <bits/stdc++.h>
using namespace std;
 
// Function to count such triplets
int countTriplets(int arr[], int n, int m)
{
    // Store all the elements in a set
    unordered_map<int, int> occ;
    for (int i = 0; i < n; i++)
        occ[arr[i]] = i;
 
    int count = 0;
 
    // Consider all pairs and check for a
    // third number so their product is equal to m
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            // Check if current pair divides m or not
            // If yes, then search for (m / arr[i]*arr[j])
            if ((arr[i] * arr[j] <= m) && (arr[i] * arr[j] != 0) && (m % (arr[i] * arr[j]) == 0)) {
                int check = m / (arr[i] * arr[j]);
                auto it = occ.find(check);
 
                // Check if the third number is present
                // in the map and it is not equal to any
                // other two elements and also check if
                // this triplet is not counted already
                // using their indexes
                if (check != arr[i] && check != arr[j]
                    && it != occ.end() && it->second > i
                    && it->second > j)
                    count++;
            }
        }
    }
 
    // Return number of triplets
    return count;
}
 
// Drivers code
int main()
{
    int arr[] = { 1, 4, 6, 2, 3, 8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int m = 24;
 
    cout << countTriplets(arr, n, m);
 
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to count triplets with given
// product m
 
import java.util.HashMap;
 
class GFG {
    // Method to count such triplets
    static int countTriplets(int arr[], int n, int m)
    {
        // Store all the elements in a set
        HashMap<Integer, Integer> occ = new HashMap<Integer, Integer>(n);
        for (int i = 0; i < n; i++)
            occ.put(arr[i], i);
 
        int count = 0;
 
        // Consider all pairs and check for a
        // third number so their product is equal to m
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                // Check if current pair divides m or not
                // If yes, then search for (m / arr[i]*arr[j])
                if ((arr[i] * arr[j] <= m) && (arr[i] * arr[j] != 0) && (m % (arr[i] * arr[j]) == 0)) {
                    int check = m / (arr[i] * arr[j]);
 
                    occ.containsKey(check);
 
                    // Check if the third number is present
                    // in the map and it is not equal to any
                    // other two elements and also check if
                    // this triplet is not counted already
                    // using their indexes
                    if (check != arr[i] && check != arr[j]
                        && occ.containsKey(check) && occ.get(check) > i
                        && occ.get(check) > j)
                        count++;
                }
            }
        }
 
        // Return number of triplets
        return count;
    }
 
    // Driver method
    public static void main(String[] args)
    {
        int arr[] = { 1, 4, 6, 2, 3, 8 };
        int m = 24;
 
        System.out.println(countTriplets(arr, arr.length, m));
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
 
# Function to find the triplet
def countTriplets(li,product):
    flag = 0
    count = 0
     
    # Consider all pairs and check
    # for a third number so their
    # product is equal to product
    for i in range(len(li)):
         
        # Check if current pair
        # divides product or not
        # If yes, then search for
        # (product / li[i]*li[j])
        if li[i]!= 0 and product % li[i] == 0:
             
            for j in range(i+1, len(li)):
                
                # Check if the third number is present
                # in the map and it is not equal to any
                # other two elements and also check if
                # this triplet is not counted already
                # using their indexes
                if li[j]!= 0 and product % (li[j]*li[i]) == 0:
                    if product // (li[j]*li[i]) in li:
                     
                        n = li.index(product//(li[j]*li[i]))
                     
                        if n > i and n > j:
                            flag = 1
                            count+=1
    print(count)
    
# Driver code
li = 1, 4, 6, 2, 3, 8 ]
product = 24
 
# Function call
countTriplets(li,product)
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above
// approach
using System;
using System.Collections.Generic;
class GFG{
     
// Method to count such triplets
static int countTriplets(int[] arr,
                         int n, int m)
{
  // Store all the elements
  // in a set
  Dictionary<int,
             int> occ = new Dictionary<int,
                                       int>(n); 
 
  for (int i = 0; i < n; i++)
    occ.Add(arr[i], i);
 
  int count = 0;
 
  // Consider all pairs and
  // check for a third number
  // so their product is equal to m
  for (int i = 0; i < n - 1; i++)
  {
    for (int j = i + 1; j < n; j++)
    {
      // Check if current pair divides
      // m or not If yes, then search
      // for (m / arr[i]*arr[j])
      if ((arr[i] * arr[j] <= m) &&
          (arr[i] * arr[j] != 0) &&
          (m % (arr[i] * arr[j]) == 0))
      {
        int check = m / (arr[i] * arr[j]);
 
        //occ.containsKey(check);
        // Check if the third number
        // is present in the map and
        // it is not equal to any
        // other two elements and also
        // check if this triplet is not
        // counted already using their indexes
        if (check != arr[i] &&
            check != arr[j] &&
            occ.ContainsKey(check) &&
            occ[check] > i &&
            occ[check] > j)
          count++;
      }
    }
  }
 
  // Return number of triplets
  return count;
}
 
// Driver code
static void Main()
{
  int[] arr = {1, 4, 6,
               2, 3, 8};
  int m = 24;
  Console.WriteLine(countTriplets(arr,
                                  arr.Length, m));
}
}
 
// This code is contributed by divyeshrabadiya07
chevron_right

Output: 
 

3





Time Complexity : O(n2
Auxiliary Space : O(n)
This article is contributed by Sahil Chhabra. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.





Article Tags :
Practice Tags :