Skip to content
Related Articles

Related Articles

Improve Article

Max count of unique ratio/fraction pairs in given arrays

  • Difficulty Level : Hard
  • Last Updated : 10 Jun, 2021

Given two arrays num[] and den[] which denotes the numerator and denominator respectively, the task is to find the count of the unique fractions.
Examples: 
 

Input: num[] = {1, 2, 3, 4, 5}, den[] = {2, 4, 6, 1, 11} 
Output:
Explanation: 
Simplest forms of the fractions 
Frac[0] => \frac{1}{2}

Frac[1] =>\frac{2}{4} = \frac{1}{2}

Frac[2] =>\frac{3}{6} = \frac{1}{2}

Frac[3] =>\frac{4}{1}



Frac[4] =>\frac{5}{11}

Count of Unique Fractions => 3
Input: num[] = {10, 20, 30, 50}, den[] = {10, 10, 10, 10} 
Output:
Explanation: 
Simplest forms of the fractions 
Frac[0] =>\frac{10}{10}

Frac[1] =>\frac{20}{10}

Frac[2] =>\frac{30}{10}

Frac[3] =>\frac{50}{10}

Count of Unique Fractions => 4

Approach: The idea is to use hash-map to find the unique fractions. To store the fractions such that the duplicates are not there, we convert each fraction to its lowest form
Below is the implementation of the above approach:
 

C++




// C++ implementation to find
// fractions in its lowest form
 
#include <bits/stdc++.h>
 
using namespace std;
 
// Recursive function to
// find gcd of a and b
int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
 
// Function to count the unique
// fractios in the given array
int countUniqueFractions(int num[],
                int den[], int N){
     
    // Hash-map to store the fractions
    // in its lowest form
    map<pair<int, int>, int> mp;
     
    // Loop to iterate over the
    // fractions and store is lowest
    // form in the hash-map
    for (int i = 0; i < N; i++) {
        int numer, denom;
         
        // To find the Lowest form
        numer = num[i] / gcd(num[i], den[i]);
        denom = den[i] / gcd(num[i], den[i]);
        mp[make_pair(numer, denom)] += 1;
    }
     
    return mp.size();
}
 
// Driver code
int main()
{
    int N = 6;
     
    // Numerator Array
    int num[] = { 1, 40, 20, 5, 6, 7 };
     
    // Denominator Array
    int den[] = { 10, 40, 2, 5, 12, 14 };
     
    cout << countUniqueFractions(num, den, N);
     
    return 0;
}

Java




// Java implementation to find 
// fractions in its lowest form
import java.lang.*;
import java.util.*;
 
class GFG{
     
static class pair
{
    int x, y;
    pair(int x,int y)
    {
        this.x = x;
        this.y = y;
    }
 
    @Override
    public int hashCode()
    {
        return this.x;
    }
     
    @Override
    public boolean equals(Object obj)
    {
         
        // If both the object references are
        // referring to the same object.
        if(this == obj)
        return true;
         
        // It checks if the argument is of the
        // type pair by comparing the classes
        // of the passed argument and this object.
        // if(!(obj instanceof pair)) return
        // false; ---> avoid.
        if(obj == null ||
           obj.getClass() !=
          this.getClass())
            return false;
         
        // Type casting of the argument.
        pair geek = (pair) obj;
         
        // comparing the state of argument with
        // the state of 'this' Object.
        return (geek.x == this.x &&
                geek.y == this.y);
    }
}
 
// Recursive function to
// find gcd of a and b
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
         
    return gcd(b, a % b);
}
 
// Function to count the unique
// fractios in the given array
static int countUniqueFractions(int num[],
                                int den[], int N)
{
     
    // Hash-map to store the fractions
    // in its lowest form
    Map<pair, Integer> mp = new HashMap<>();
     
    // Loop to iterate over the
    // fractions and store is lowest
    // form in the hash-map
    for(int i = 0; i < N; i++)
    {
         
        // To find the Lowest form
        int numer = num[i] / gcd(num[i], den[i]);
        int denom = den[i] / gcd(num[i], den[i]);
        pair tmp = new pair(numer, denom);
        mp.put(tmp, 1);
    }
    return mp.size();
}
 
// Driver Code
public static void main (String[] args)
{
    int N = 6;
     
    // Numerator Array
    int num[] = { 1, 40, 20, 5, 6, 7 };
     
    // Denominator Array
    int den[] = { 10, 40, 2, 5, 12, 14 };
     
    System.out.print(countUniqueFractions(num, den, N));
}
}
 
// This code is contributed by offbeat

Python3




# Python3 implementation to find
# fractions in its lowest form
from collections import defaultdict
 
# Recursive function to
# find gcd of a and b
def gcd(a, b):
 
    if (b == 0):
        return a
    return gcd(b, a % b)
 
# Function to count the unique
# fractios in the given array
def countUniqueFractions(num, den, N):
     
    # Hash-map to store the fractions
    # in its lowest form
    mp = defaultdict(int)
     
    # Loop to iterate over the
    # fractions and store is lowest
    # form in the hash-map
    for i in range(N):
         
        # To find the Lowest form
        numer = num[i] // gcd(num[i], den[i])
        denom = den[i] // gcd(num[i], den[i])
        mp[(numer, denom)] += 1
     
    return len(mp)
 
# Driver code
if __name__ == "__main__":
     
    N = 6
     
    # Numerator Array
    num = [ 1, 40, 20, 5, 6, 7 ]
     
    # Denominator Array
    den = [ 10, 40, 2, 5, 12, 14 ]
     
    print(countUniqueFractions(num, den, N))
 
# This code is contributed by chitranayal

Javascript




<script>
 
// Javascript implementation to find 
// fractions in its lowest form
 
 
// Recursive function to
// find gcd of a and b
function gcd(a,b)
{
    if (b == 0)
        return a;
           
    return gcd(b, a % b);
}
 
// Function to count the unique
// fractios in the given array
function countUniqueFractions(num,den,N)
{
    // Hash-map to store the fractions
    // in its lowest form
    let mp = new Map();
       
    // Loop to iterate over the
    // fractions and store is lowest
    // form in the hash-map
    for(let i = 0; i < N; i++)
    {
           
        // To find the Lowest form
        let numer = num[i] / gcd(num[i], den[i]);
        let denom = den[i] / gcd(num[i], den[i]);
        let tmp = [numer, denom];
        mp.set(tmp.toString(), 1);
    }
    return mp.size;
}
// Driver Code
 
let N = 6;
// Numerator Array
let num=[1, 40, 20, 5, 6, 7 ];
// Denominator Array
let den=[10, 40, 2, 5, 12, 14];
document.write(countUniqueFractions(num, den, N));
 
 
 
// This code is contributed by avanitrachhadiya2155
</script>
Output: 
4

 

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :