Count pairs in an array such that LCM(arr[i], arr[j]) > min(arr[i],arr[j])

Given an array arr[], the task is to find the count of pairs from the array such that LCM(arr[i], arr[j]) > min(arr[i], arr[j])
Note: Pairs (arr[i], arr[j]) and (arr[j], arr[i]) are considered identical and will be counted only once.

Examples:

Input: arr[] = {1, 1, 4, 9}
Output: 5
All valid pairs are (1, 4), (1, 9), (1, 4), (1, 9) and (4, 9)

Input: arr[] = {2, 4, 5, 2, 5, 7, 2, 8}
Output: 24

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: It is observed that only the pairs of the form (arr[i], arr[j]) where arr[i] = arr[j] won’t satisfy the given condition. So, the problem now gets reduced to finding the number of pairs (arr[i], arr[j]) such that arr[i] != arr[j].

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach #include using namespace std;    // Function to return the count of valid pairs int count_pairs(int n, int a[]) {     // Store frequencies of array elements     unordered_map frequency;     for (int i = 0; i < n; i++) {         frequency[a[i]]++;     }        int count = 0;        // Count of pairs (arr[i], arr[j])      // where arr[i] = arr[j]     for (auto x : frequency) {         int f = x.second;         count += f * (f - 1) / 2;     }        // Count of pairs (arr[i], arr[j]) where     // arr[i] != arr[j], i.e. Total pairs - pairs      // where arr[i] = arr[j]     return ((n * (n - 1)) / 2) - count; }    // Driver Code int main() {     int arr[] = { 2, 4, 5, 2, 5, 7, 2, 8 };     int n = sizeof(arr) / sizeof(arr[0]);     cout << count_pairs(n, arr);     return 0; }

Java

 // Java implementation of the approach import java.util.HashMap; import java.util.Map;    class GfG {        // Function to return the count of valid pairs      static int count_pairs(int n, int a[])      {          // Store frequencies of array elements          HashMap frequency = new HashMap<>();          for (int i = 0; i < n; i++)         {                             if (!frequency.containsKey(a[i]))                 frequency.put(a[i], 0);             frequency.put(a[i], frequency.get(a[i])+1);          }                 int count = 0;                 // Count of pairs (arr[i], arr[j])          // where arr[i] = arr[j]          for (Map.Entry x: frequency.entrySet())         {              int f = x.getValue();              count += f * (f - 1) / 2;          }                 // Count of pairs (arr[i], arr[j]) where          // arr[i] != arr[j], i.e. Total pairs - pairs          // where arr[i] = arr[j]          return ((n * (n - 1)) / 2) - count;      }        // Driver code     public static void main(String []args)     {                    int arr[] = { 2, 4, 5, 2, 5, 7, 2, 8 };          int n = arr.length;          System.out.println(count_pairs(n, arr));     } }        // This code is contributed by Rituraj Jain

Python3

 # Python3 implementation of the approach     # Function to return the count  # of valid pairs  def count_pairs(n, a) :         # Store frequencies of array elements      frequency = dict.fromkeys(a, 0)      for i in range(n) :         frequency[a[i]] += 1        count = 0        # Count of pairs (arr[i], arr[j])      # where arr[i] = arr[j]      for f in frequency.values() :          count += f * (f - 1) // 2            # Count of pairs (arr[i], arr[j]) where      # arr[i] != arr[j], i.e. Total pairs - pairs      # where arr[i] = arr[j]      return ((n * (n - 1)) // 2) - count    # Driver Code  if __name__ == "__main__" :            arr = [ 2, 4, 5, 2,              5, 7, 2, 8 ]      n = len(arr)     print(count_pairs(n, arr))    # This code is contributed by Ryuga

C#

 // C# implementation of the approach using System; using System.Collections.Generic;     class GfG {        // Function to return the count of valid pairs      static int count_pairs(int n, int []arr)      {          // Store frequencies of array elements          Dictionary mp = new Dictionary();         for (int i = 0 ; i < n; i++)         {             if(mp.ContainsKey(arr[i]))             {                 var val = mp[arr[i]];                 mp.Remove(arr[i]);                 mp.Add(arr[i], val + 1);              }             else             {                 mp.Add(arr[i], 1);             }         }         int count = 0;                 // Count of pairs (arr[i], arr[j])          // where arr[i] = arr[j]          foreach(KeyValuePair x in mp)         {              int f = x.Value;              count += f * (f - 1) / 2;          }                 // Count of pairs (arr[i], arr[j]) where          // arr[i] != arr[j], i.e. Total pairs - pairs          // where arr[i] = arr[j]          return ((n * (n - 1)) / 2) - count;      }        // Driver code     public static void Main(String []args)     {                    int []arr = { 2, 4, 5, 2, 5, 7, 2, 8 };          int n = arr.Length;          Console.WriteLine(count_pairs(n, arr));     } }    // This code is contributed by Rajput-Ji

Output:

24

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.

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.