Count array elements whose count of divisors is a prime number
Given an array arr[] consisting of N positive integers, the task is to find the number of array elements whose count of divisors is a prime number.
Examples:
Input: arr[] = {3, 6, 4}
Output: 2
Explanation:
The count of divisors for each element are:
- arr[0]( = 3): 3 has 2 divisors i.e., 1 and 3.
- arr[1]( = 6): 6 has 4 divisors i.e., 1, 2, 3, and 6.
- arr[2]( = 4): 4 has 3 divisors i.e., 1, 2, and 4.
Therefore, there are only 2 array elements, i.e. {3, 4}, whose count of divisors is a prime number.
Input: arr[] = {10, 13, 17, 25}
Output: 3
Naive Approach: The simplest approach to solve the given problem is to find the number of divisors for each array element and check if the count of divisors is a prime number or not. If found to be true, then increment the count. Otherwise, check for the next element. After checking for all array elements, print the count obtained.
Time Complexity: O(N(3/2))
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized by precomputing the Prime Numbers using Sieve of Eratosthenes. Follow the steps below to solve the given problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int primeDivisors( int arr[], int N)
{
int K = arr[0];
for ( int i = 1; i < N; i++) {
K = max(K, arr[i]);
}
int prime[K + 1] = { 0 };
prime[0] = 1;
prime[1] = 1;
for ( int i = 2; i < K + 1; i++) {
if (!prime[i]) {
for ( int j = 2 * i;
j < K + 1; j += i) {
prime[j] = 1;
}
}
}
int factor[K + 1] = { 0 };
factor[0] = 0;
factor[1] = 1;
for ( int i = 2; i < K + 1; i++) {
factor[i] += 1;
for ( int j = i; j < K + 1;
j += i) {
factor[j] += 1;
}
}
int count = 0;
for ( int i = 0; i < N; i++) {
if (prime[factor[arr[i]]] == 0)
count++;
}
return count;
}
int main()
{
int arr[] = { 10, 13, 17, 25 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << primeDivisors(arr, N);
return 0;
}
|
Java
public class GFG
{
public static int primeDivisors( int [] arr, int N)
{
int K = arr[ 0 ];
for ( int i = 1 ; i < N; i++) {
K = Math.max(K, arr[i]);
}
int [] prime = new int [K + 1 ];
prime[ 0 ] = 1 ;
prime[ 1 ] = 1 ;
for ( int i = 2 ; i < K + 1 ; i++) {
if (prime[i] == 0 ) {
for ( int j = 2 * i; j < K + 1 ; j += i) {
prime[j] = 1 ;
}
}
}
int [] factor = new int [K + 1 ];
factor[ 0 ] = 0 ;
factor[ 1 ] = 1 ;
for ( int i = 2 ; i < K + 1 ; i++) {
factor[i] += 1 ;
for ( int j = i; j < K + 1 ; j += i) {
factor[j] += 1 ;
}
}
int count = 0 ;
for ( int i = 0 ; i < N; i++) {
if (prime[factor[arr[i]]] == 0 )
count++;
}
return count;
}
public static void main(String args[]) {
int [] arr = { 10 , 13 , 17 , 25 };
int N = arr.length;
System.out.println(primeDivisors(arr, N));
}
}
|
Python3
def primeDivisors(arr, N):
K = arr[ 0 ]
for i in range ( 1 , N):
K = max (K, arr[i])
prime = [ 0 ] * (K + 1 )
prime[ 0 ] = 1
prime[ 1 ] = 1
for i in range ( 2 , K + 1 ):
if ( not prime[i]):
for j in range ( 2 * i, K + 1 , i):
prime[j] = 1
factor = [ 0 ] * (K + 1 )
factor[ 0 ] = 0
factor[ 1 ] = 1
for i in range ( 2 , K + 1 ):
factor[i] + = 1
for j in range (i, K + 1 , i):
factor[j] + = 1
count = 0
for i in range (N):
if (prime[factor[arr[i]]] = = 0 ):
count + = 1
return count
if __name__ = = '__main__' :
arr = [ 10 , 13 , 17 , 25 ]
N = len (arr)
print (primeDivisors(arr, N))
|
C#
using System;
class GFG
{
static int primeDivisors( int [] arr, int N)
{
int K = arr[0];
for ( int i = 1; i < N; i++) {
K = Math.Max(K, arr[i]);
}
int [] prime = new int [K + 1];
prime[0] = 1;
prime[1] = 1;
for ( int i = 2; i < K + 1; i++) {
if (prime[i] == 0) {
for ( int j = 2 * i; j < K + 1; j += i) {
prime[j] = 1;
}
}
}
int [] factor = new int [K + 1];
factor[0] = 0;
factor[1] = 1;
for ( int i = 2; i < K + 1; i++) {
factor[i] += 1;
for ( int j = i; j < K + 1; j += i) {
factor[j] += 1;
}
}
int count = 0;
for ( int i = 0; i < N; i++) {
if (prime[factor[arr[i]]] == 0)
count++;
}
return count;
}
public static void Main()
{
int [] arr = { 10, 13, 17, 25 };
int N = arr.Length;
Console.WriteLine(primeDivisors(arr, N));
}
}
|
Javascript
<script>
function primeDivisors(arr, N)
{
var K = arr[0];
var i,j;
for (i = 1; i < N; i++) {
K = Math.max(K, arr[i]);
}
var prime = Array(K + 1).fill(0);
prime[0] = 1;
prime[1] = 1;
for (i = 2; i < K + 1; i++) {
if (prime[i]==0) {
for (j = 2 * i;
j < K + 1; j += i) {
prime[j] = 1;
}
}
}
var factor = Array(K + 1).fill(0);
factor[0] = 0;
factor[1] = 1;
for (i = 2; i < K + 1; i++) {
factor[i] += 1;
for (j = i; j < K + 1;
j += i) {
factor[j] += 1;
}
}
var count = 0;
for (i = 0; i < N; i++) {
if (prime[factor[arr[i]]] == 0)
count++;
}
return count;
}
var arr = [10, 13, 17, 25];
var N = arr.length;
document.write(primeDivisors(arr, N));
</script>
|
Time Complexity: O(M*log M), where M is the maximum element of the given array.
Auxiliary Space: O(M)
Last Updated :
20 May, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...