Count elements that are divisible by at-least one element in another array

Given two arrays arr1[] and arr2[]. The task is to find the count of such elements in the first array whose at-least one factor is present in the second array.

Examples:

Input : arr1[] = {10, 2, 13, 4, 15} ; arr2[] = {2, 4, 5, 6}
Output : 4
There is no factor of 13 which is present in the 
second array. Except 13, factors of the rest 4 
elements of the first array is present in the 
second array.

Input : arr1[] = {11, 13, 17, 15} ; arr2[] = {3, 7, 9, 5}
Output : 1

The idea is to insert all elements of the second array into a hash such that the lookup for factors can be done in constant time. Now, traverse the first array and for every element generate all of the factors starting from 1 and check if any of the factors is present in the hash or not.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find count of
// elements in first array whose
// atleast one factor is present
// in second array.
#include <bits/stdc++.h>
using namespace std;
  
// Util function to count the elements
// in first array whose atleast
// one factor is present in second array
int elementCount(int arr1[], int n1, int arr2[], int n2)
{
  
    // counter to count number of elements
    int count = 0;
  
    // Hash of second array elements
    unordered_set<int> hash;
    for (int i = 0; i < n2; i++)
        hash.insert(arr2[i]);
  
    // loop to traverse through array elements
    // and check for its factors
    for (int i = 0; i < n1; i++) {
  
        // generate factors of elements
        // of first array
        for (int j = 1; j * j <= arr1[i]; j++) { 
  
            // Check if j is a factor
            if (arr1[i] % j == 0) {
  
                // check if the factor is present in
                // second array using the hash
                if ((hash.find(j) != hash.end()) || 
                        (hash.find(arr1[i] / j) != hash.end())) {
                    count++;
                    break;
                }
            }
        }
    }
  
    return count;
}
  
// Driver code
int main()
{
    int arr1[] = { 10, 2, 13, 4, 15 };
    int arr2[] = { 2, 4, 5, 6 };
  
    int n1 = sizeof(arr1) / sizeof(arr1[0]);
    int n2 = sizeof(arr2) / sizeof(arr2[0]);
  
    cout << elementCount(arr1, n1, arr2, n2);
  
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find count of
// elements in first array whose
// atleast one factor is present
// in second array. 
import java.util.*;
  
class GFG
{
  
    // Util function to count the elements
    // in first array whose atleast
    // one factor is present in second array
    static int elementCount(int arr1[], int n1,
                            int arr2[], int n2) 
    {
  
        // counter to count number of elements
        int count = 0;
  
        // Hash of second array element
        HashSet<Integer> hash = new HashSet<>();
        for (int i = 0; i < n2; i++) 
        {
            hash.add(arr2[i]);
        }
  
        // loop to traverse through array elements
        // and check for its factors
        for (int i = 0; i < n1; i++) 
        {
  
            // generate factors of elements
            // of first array
            for (int j = 1; j * j <= arr1[i]; j++) 
            {
  
                // Check if j is a factor
                if (arr1[i] % j == 0)
                {
  
                    // check if the factor is present in
                    // second array using the hash
                    if ((hash.contains(j) && j != 
                        (int) hash.toArray()[hash.size() - 1]) ||
                        (hash.contains(arr1[i] / j) && (arr1[i] / j) != 
                        (int) hash.toArray()[hash.size() - 1])) 
                    {
                        count++;
                        break;
                    }
                }
            }
        }
  
        return count;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr1[] = {10, 2, 13, 4, 15};
        int arr2[] = {2, 4, 5, 6};
  
        int n1 = arr1.length;
        int n2 = arr2.length;
        System.out.println(elementCount(arr1, n1, arr2, n2));
    }
}
  
/* This code contributed by PrinciRaj1992 */
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to find count of
# elements in first array whose
# atleast one factor is present
# in second array.
   
# Importing sqrt() function
from math import sqrt
   
# Util function to count the 
# elements in first array 
# whose atleast one factor is
# present in second array
def elementCount(arr1, arr2):
     
  # counter to count
  # number of elements
  count = 0
     
  # Hash of second array elements
  hash = frozenset(arr2)
     
  # loop to traverse through array 
  # elements and check for its factors
  for x in arr1:
         
    # generate factors of 
    # elements of first array
    for j in range(1, int(sqrt(x)) + 1):
     
      # Check if j is a factor
      if x % j == 0:
   
        # check if the factor is present 
        # in second array using the hash
        if (j in hash or
            x / j in hash):
          count+=1
          break
     
  return count
   
# Driver code
arr1 = [ 10, 2, 13, 4, 15 ]
arr2 = [ 2, 4, 5, 6 ]
   
print(elementCount(arr1, arr2))
   
# This code is contributed 
# by vaibhav29498
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find count of
// elements in first array whose
// atleast one factor is present
// in second array. 
using System;
using System.Linq;
using System.Collections.Generic;
  
class GFG
{
  
    // Util function to count the elements
    // in first array whose atleast
    // one factor is present in second array
    static int elementCount(int []arr1, int n1,
                            int []arr2, int n2) 
    {
  
        // counter to count number of elements
        int count = 0;
  
        // Hash of second array element
        HashSet<int> hash = new HashSet<int>();
        for (int i = 0; i < n2; i++) 
        {
            hash.Add(arr2[i]);
        }
  
        // loop to traverse through array elements
        // and check for its factors
        for (int i = 0; i < n1; i++) 
        {
  
            // generate factors of elements
            // of first array
            for (int j = 1; j * j <= arr1[i]; j++) 
            {
  
                // Check if j is a factor
                if (arr1[i] % j == 0)
                {
  
                    // check if the factor is present in
                    // second array using the hash
                    if ((hash.Contains(j) && j != 
                        (int) hash.ToArray()[hash.Count- 1]) ||
                        (hash.Contains(arr1[i] / j) && (arr1[i] / j) != 
                        (int) hash.ToArray()[hash.Count - 1])) 
                    {
                        count++;
                        break;
                    }
                }
            }
        }
  
        return count;
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        int []arr1 = {10, 2, 13, 4, 15};
        int []arr2 = {2, 4, 5, 6};
  
        int n1 = arr1.Length;
        int n2 = arr2.Length;
        Console.WriteLine(elementCount(arr1, n1, arr2, n2));
    }
}
  
// This code contributed by Rajput-Ji
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find count of
// elements in first array whose
// atleast one factor is present
// in second array.
  
// Util function to count the 
// elements in first array 
// whose atleast one factor is
// present in second array
function elementCount($arr1, $arr2)
    // counter to count
    // number of elements
    $count = 0;
          
    // Hash of second array elements
    $hash = array_unique($arr2);
          
    // loop to traverse through array 
    // elements and check for its factors
    foreach($arr1 as &$x)
      
        // generate factors of 
        // elements of first array
        for ($j = 1; $j < (int)(sqrt($x)) + 1; $j++)
          
        // Check if j is a factor
        if ($x % $j == 0)
        {
              
            // check if the factor is present 
            // in second array using the hash
            if (in_array($j, $hash) || 
                in_array((int)($x / $j), $hash))
            {
                $count++;
                break;
            }
        }
          
    return $count;
}
  
// Driver code
$arr1 = array( 10, 2, 13, 4, 15 );
$arr2 = array( 2, 4, 5, 6 );
  
print(elementCount($arr1, $arr2));
  
// This code is contributed mits
?>
chevron_right


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.




Recommended Posts:


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.



Article Tags :
Practice Tags :