Open In App

Count numbers from a given range that are not divisible by any of the array elements

Last Updated : 11 May, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] consisting of N positive integers and integers L and R, the task is to find the count of numbers in the range [L, R] which are not divisible by any of the array elements.

Examples:

Input: arr[] = {2, 3, 4, 5, 6}, L = 1, R = 20
Output: 6
Explanation:
The 6 numbers in the range [1, 20] that are not divisible by any of the array elements are 1, 7, 11, 13, 17 and 19.

Input: arr[] = {1, 2, 3}, L = 75, R = 1000000
Output:
Explanation:
Since all the numbers are divisible by 1, therefore, the answer is 0.

Naive Approach: The simple approach is to iterate through all the numbers in the given range [L, R], and for every number, check if it is divisible by any of the array elements. If it is not divisible by any of the array elements, increment the count. After checking for all the numbers, print the count. 

Time Complexity: O((R – L + 1)*N)
Auxiliary Space: O(N)

Efficient Approach: The above approach can be optimized by using Sieve of Eratosthenes, marking all the multiples of a number and storing them in an efficient data structure, say Set which provides a lookup operation in almost constant time. Follow the steps below to solve the problem:

  • First, for each array element, say arr[i], store all its multiples, smaller than R, in a Set using Sieve of Eratosthenes.
  • The number of integers in the range [1, R] that are not divisible by any number present in the given array will be equal to (R – size of the set). Let it be A.
  • Similarly, find the numbers in the range [1, L] that are not divisible by any number present in the given array. Let it be B.
  • After the above steps, print the value of (A – B) as the result.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the non-multiples
// till k
int findNonMultiples(int arr[],
                     int n, int k)
{
    // Stores all unique multiples
    set<int> multiples;
 
    // Iterate the array
    for (int i = 0; i < n; ++i) {
 
        // For finding duplicates
        // only once
        if (multiples.find(arr[i])
            == multiples.end()) {
 
            // Inserting all multiples
            // into the set
            for (int j = 1;
                 j <= k / arr[i]; j++) {
                multiples.insert(arr[i] * j);
            }
        }
    }
 
    // Returning only the count of
    // numbers that are not divisible
    // by any of the array elements
    return k - multiples.size();
}
 
// Function to count the total values
// in the range [L, R]
int countValues(int arr[], int N,
                int L, int R)
{
    // Count all values in the range
    // using exclusion principle
    return findNonMultiples(arr, N, R)
           - findNonMultiples(arr, N, L - 1);
}
 
// Driver Code
int main()
{
    int arr[] = { 2, 3, 4, 5, 6 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int L = 1, R = 20;
 
    // Function Call
    cout << countValues(arr, N, L, R);
 
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG{
 
// Function to find the non-multiples
// till k
public static int findNonMultiples(int[] arr, int n,
                                   int k)
{
     
    // Stores all unique multiples
    Set<Integer> multiples = new HashSet<Integer>();
     
    // Iterate the array
    for(int i = 0; i < n; ++i)
    {
         
        // For finding duplicates
        // only once
        if (!multiples.contains(arr[i]))
        {
             
            // Inserting all multiples
            // into the set
            for(int j = 1; j <= k / arr[i]; j++)
            {
                multiples.add(arr[i] * j);
            }
        }
    }
     
    // Returning only the count of
    // numbers that are not divisible
    // by any of the array elements
    return k - multiples.size();
}
 
// Function to count the total values
// in the range [L, R]
public static int countValues(int[] arr, int N,
                              int L, int R)
{
     
    // Count all values in the range
    // using exclusion principle
    return findNonMultiples(arr, N, R) -
           findNonMultiples(arr, N, L - 1);
}
 
// Driver code
public static void main(String[] args)
{
    int[] arr = { 2, 3, 4, 5, 6 };
    int N = arr.length;
    int L = 1;
    int R = 20;
 
    // Function Call
    System.out.println(countValues(arr, N, L, R));
}
}
 
// This code is contributed by rohitsingh07052


Python3




# Python3 program for the above approach
 
# Function to find the non-multiples
# till k
def findNonMultiples(arr, n, k):
 
    # Stores all unique multiples
    multiples = set([])
 
    # Iterate the array
    for i in range(n):
 
        # For finding duplicates
        # only once
        if (arr[i] not in multiples):
 
            # Inserting all multiples
            # into the set
            for j in range(1, k // arr[i] + 1):
                multiples.add(arr[i] * j)
 
    # Returning only the count of
    # numbers that are not divisible
    # by any of the array elements
    return k - len(multiples)
 
# Function to count the total values
# in the range [L, R]
def countValues(arr, N, L, R):
 
    # Count all values in the range
    # using exclusion principle
    return (findNonMultiples(arr, N, R) -
            findNonMultiples(arr, N, L - 1))
 
# Driver Code
if __name__ == "__main__":
   
    arr = [ 2, 3, 4, 5, 6 ]
    N = len(arr)
    L = 1
    R = 20
     
    # Function Call
    print( countValues(arr, N, L, R))
 
# This code is contributed by chitranayal


C#




// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG
{
 
// Function to find the non-multiples
// till k
public static int findNonMultiples(int[] arr, int n,
                                   int k)
{
     
    // Stores all unique multiples
    HashSet<int> multiples = new HashSet<int>();
     
    // Iterate the array
    for(int i = 0; i < n; ++i)
    {
         
        // For finding duplicates
        // only once
        if (!multiples.Contains(arr[i]))
        {
             
            // Inserting all multiples
            // into the set
            for(int j = 1; j <= k / arr[i]; j++)
            {
                multiples.Add(arr[i] * j);
            }
        }
    }
     
    // Returning only the count of
    // numbers that are not divisible
    // by any of the array elements
    return k - multiples.Count;
}
 
// Function to count the total values
// in the range [L, R]
public static int countValues(int[] arr, int N,
                              int L, int R)
{
     
    // Count all values in the range
    // using exclusion principle
    return findNonMultiples(arr, N, R) -
           findNonMultiples(arr, N, L - 1);
}
 
// Driver code
public static void Main(String[] args)
{
    int[] arr = { 2, 3, 4, 5, 6 };
    int N = arr.Length;
    int L = 1;
    int R = 20;
 
    // Function Call
    Console.WriteLine(countValues(arr, N, L, R));
}
}
 
// This code is contributed by shikhasingrajput


Javascript




<script>
 
// Javascript program for the above approach
 
// Function to find the non-multiples
// till k
function findNonMultiples(arr, n, k)
{
    // Stores all unique multiples
    let multiples = new Set();
 
    // Iterate the array
    for (let i = 0; i < n; ++i) {
 
        // For finding duplicates
        // only once
        if (!multiples.has(arr[i])) {
 
            // Inserting all multiples
            // into the set
            for (let j = 1;
                j <= k / arr[i]; j++) {
                multiples.add(arr[i] * j);
            }
        }
    }
 
    // Returning only the count of
    // numbers that are not divisible
    // by any of the array elements
     
    return k - multiples.size;
}
 
// Function to count the total values
// in the range [L, R]
function countValues(arr, N, L, R)
{
    // Count all values in the range
    // using exclusion principle
    return findNonMultiples(arr, N, R)
        - findNonMultiples(arr, N, L - 1);
}
 
// Driver Code
 
    let arr = [ 2, 3, 4, 5, 6 ];
    let N = arr.length;
    let L = 1, R = 20;
 
    // Function Call
    document.write(countValues(arr, N, L, R));
     
 // This code is contributed by _saurabh_jaiswal
  
 </script>


Output: 

6

 

Time Complexity: O(N*log(log N))
Auxiliary Space: O(N)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads