Open In App

Count distinct prime factors for each element of an array

Given an array arr[] of size N, the task is to find the count of distinct prime factors of each element of the given array.

Examples:



Input: arr[] = {6, 9, 12}
Output: 2 1 2
Explanation:

  • 6 = 2 × 3. Therefore, count = 2
  • 9 = 3 × 3. Therefore, count = 1
  • 12 = 2 × 2 × 3. Therefore, count = 2

The count of distinct prime factors of each array element are 2, 1, 2 respectively.



Input: arr[] = {4, 8, 10, 6}
Output: 1 1 2 2

Naive Approach: The simplest approach to solve the problem is to find the distinct prime factors of each array element. Then, print that count for each array element. 

steps to implement-

Code-




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// A function to provide count of
//distinct prime factor of a given number
int primeFactors(int n)
{
    //To store count of distinct prime factor of given number
    int count=0;
     
    //Boolean variable to check an element
    //is included in its prime factor or not
    bool val=false;
     
    // Remove all 2s that can be prime factor of n
    while (n % 2 == 0)
    {  
        val=true;
        n = n/2;
    }
     
    //If 2 is included
    if(val==true){count++;}
  
    // n must be odd at this point. So we can skip
    // one element (Note i = i +2)
    for (int i = 3; i <= sqrt(n); i = i + 2)
    {
        //To check whether i is included in prime factor
        val=false;
         
        // While i divides n,divide n
        while (n % i == 0)
        {
            val=true;
            n = n/i;
        }
        //If i is included in prime factor
        if(val==true){count++;}
    }
  
    
    // This condition is to handle the case when n
    // is a prime number greater than 2
    if (n > 2){
       count++;
    }
      return count;
}
 
// Function to get the distinct
// factor count of arr[]
void getFactorCount(int arr[],
                    int N)
{
    //Traverse every array element
    for(int i=0;i<N;i++){
        cout<<primeFactors(arr[i])<<" ";
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 6, 9, 12 };
    int N = sizeof(arr) / sizeof(arr[0]);
    getFactorCount(arr, N);
    return 0;
}




import java.util.*;
 
public class Main {
    // A function to provide count of
    // distinct prime factors of a given number
    static int primeFactors(int n) {
        // To store the count of distinct prime factors of the given number
        int count = 0;
 
        // Boolean variable to check if an element is included in its prime factor or not
        boolean val = false;
 
        // Remove all 2s that can be prime factors of n
        while (n % 2 == 0) {
            val = true;
            n = n / 2;
        }
 
        // If 2 is included
        if (val) {
            count++;
        }
 
        // n must be odd at this point. So we can skip one element (Note i = i + 2)
        for (int i = 3; i <= Math.sqrt(n); i = i + 2) {
            // To check whether i is included in prime factor
            val = false;
 
            // While i divides n, divide n
            while (n % i == 0) {
                val = true;
                n = n / i;
            }
 
            // If i is included in the prime factor
            if (val) {
                count++;
            }
        }
 
        // This condition is to handle the case when n is a prime number greater than 2
        if (n > 2) {
            count++;
        }
 
        return count;
    }
 
    // Function to get the distinct factor count of arr[]
    static void getFactorCount(int[] arr, int N) {
        // Traverse every array element
        for (int i = 0; i < N; i++) {
            System.out.print(primeFactors(arr[i]) + " ");
        }
    }
 
    public static void main(String[] args) {
        int[] arr = { 6, 9, 12 };
        int N = arr.length;
        getFactorCount(arr, N);
    }
}




import math
 
# A function to provide count of distinct prime factor of a given number
def prime_factors(n):
    # To store count of distinct prime factors of the given number
    count = 0
     
    # Boolean variable to check if an element is included in its prime factors or not
    val = False
     
    # Remove all 2s that can be prime factors of n
    while n % 2 == 0:
        val = True
        n = n // 2
     
    # If 2 is included
    if val == True:
        count += 1
 
    # n must be odd at this point. So we can skip one element (Note i = i + 2)
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        # To check whether i is included in prime factors
        val = False
         
        # While i divides n, divide n
        while n % i == 0:
            val = True
            n = n // i
         
        # If i is included in prime factors
        if val == True:
            count += 1
     
    # This condition is to handle the case when n is a prime number greater than 2
    if n > 2:
        count += 1
 
    return count
 
# Function to get the distinct factor count of arr[]
def get_factor_count(arr):
    # Traverse every array element
    for num in arr:
        print(prime_factors(num), end=" ")
 
# Driver Code
if __name__ == "__main__":
    arr = [6, 9, 12]
    get_factor_count(arr)




using System;
 
class Program
{
    // A function to provide the count of distinct prime factors of a given number
    static int PrimeFactors(int n)
    {
        // To store the count of distinct prime factors of the given number
        int count = 0;
         
        // Boolean variable to check if an element is included in its prime factors or not
        bool val = false;
         
        // Remove all 2s that can be prime factors of n
        while (n % 2 == 0)
        {
            val = true;
            n = n / 2;
        }
         
        // If 2 is included
        if (val)
        {
            count++;
        }
 
        // n must be odd at this point, so we can skip one element (Note i = i + 2)
        for (int i = 3; i <= Math.Sqrt(n); i += 2)
        {
            // To check whether i is included in prime factors
            val = false;
             
            // While i divides n, divide n
            while (n % i == 0)
            {
                val = true;
                n = n / i;
            }
             
            // If i is included in prime factors
            if (val)
            {
                count++;
            }
        }
 
        // This condition is to handle the case when n is a prime number greater than 2
        if (n > 2)
        {
            count++;
        }
         
        return count;
    }
 
    // Function to get the distinct factor count of an array
    static void GetFactorCount(int[] arr)
    {
        // Traverse every array element
        foreach (int num in arr)
        {
            Console.Write(PrimeFactors(num) + " ");
        }
    }
 
    static void Main()
    {
        int[] arr = { 6, 9, 12 };
        GetFactorCount(arr);
    }
}




// JavaScript program for the above approach
 
// A function to provide count of
//distinct prime factor of a given number
function primeFactors(n)
{
    //To store count of distinct prime factor of given number
    let count=0;
     
    //Boolean variable to check an element
    //is included in its prime factor or not
    let val=false;
     
    // Remove all 2s that can be prime factor of n
    while (n % 2 == 0)
    {  
        val=true;
        n = n/2;
    }
     
    //If 2 is included
    if(val==true){count++;}
  
    // n must be odd at this point. So we can skip
    // one element (Note i = i +2)
    for (let i = 3; i <= Math.sqrt(n); i = i + 2)
    {
        //To check whether i is included in prime factor
        val=false;
         
        // While i divides n,divide n
        while (n % i == 0)
        {
            val=true;
            n = n/i;
        }
        //If i is included in prime factor
        if(val==true){count++;}
    }
  
    
    // This condition is to handle the case when n
    // is a prime number greater than 2
    if (n > 2){
       count++;
    }
      return count;
}
 
// Function to get the distinct
// factor count of arr[]
function getFactorCount(arr, N)
{
    //Traverse every array element
    for(let i=0;i<N;i++){
        document.write(primeFactors(arr[i])+ " ");
    }
}
 
// Driver Code
    let arr = [ 6, 9, 12 ];
    let N = arr.length;
    getFactorCount(arr, N);

Output-

2 1 2 

Time Complexity: O(N * (√Maximum value present in array)), because O(N) in traversing the array and (√Maximum value present in array) is the maximum time to find the count of distinct prime factors of each Number
Auxiliary Space: O(1), because no extra space has been used

Efficient Approach: The above approach can be optimized by precomputing the distinct factors of all the numbers using their Smallest Prime Factors. Follow the steps below to solve the problem

Below is the implementation of the above approach :




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
#define MAX 100001
 
// Stores smallest prime
// factor for every number
int spf[MAX];
 
// Stores distinct prime factors
vector<int> v[MAX];
 
// Function to find the smallest
// prime factor of every number
void sieve()
{
    // Mark the smallest prime factor
    // of every number to itself
    for (int i = 1; i < MAX; i++)
        spf[i] = i;
 
    // Separately mark all the
    // smallest prime factor of
    // every even number to be 2
    for (int i = 4; i < MAX; i = i + 2)
        spf[i] = 2;
 
    for (int i = 3; i * i < MAX; i++)
 
        // If i is prime
        if (spf[i] == i) {
 
            // Mark spf for all numbers
            // divisible by i
            for (int j = i * i; j < MAX;
                 j = j + i) {
 
                // Mark spf[j] if it is
                // not previously marked
                if (spf[j] == j)
                    spf[j] = i;
            }
        }
}
 
// Function to find the distinct
// prime factors
void DistPrime()
{
    for (int i = 1; i < MAX; i++) {
 
        int idx = 1;
        int x = i;
 
        // Push all distinct of x
        // prime factor in v[x]
        if (x != 1)
            v[i].push_back(spf[x]);
 
        x = x / spf[x];
 
        while (x != 1) {
 
            if (v[i][idx - 1]
                != spf[x]) {
 
                // Pushback into v[i]
                v[i].push_back(spf[x]);
 
                // Increment the idx
                idx += 1;
            }
 
            // Update x = (x / spf[x])
            x = x / spf[x];
        }
    }
}
 
// Function to get the distinct
// factor count of arr[]
void getFactorCount(int arr[],
                    int N)
{
    // Precompute the smallest
    // Prime Factors
    sieve();
 
    // For distinct prime factors
    // Fill the v[] vector
    DistPrime();
 
    // Count of Distinct Prime
    // Factors of each array element
    for (int i = 0; i < N; i++) {
        cout << (int)v[arr[i]].size()
             << " ";
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 6, 9, 12 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    getFactorCount(arr, N);
 
    return 0;
}




// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG
{
 
  static int MAX = 100001;
 
  // Stores smallest prime
  // factor for every number
  static int spf[];
 
  // Stores distinct prime factors
  static ArrayList<Integer> v[];
 
  // Function to find the smallest
  // prime factor of every number
  static void sieve()
  {
 
    // Mark the smallest prime factor
    // of every number to itself
    for (int i = 1; i < MAX; i++)
      spf[i] = i;
 
    // Separately mark all the
    // smallest prime factor of
    // every even number to be 2
    for (int i = 4; i < MAX; i = i + 2)
      spf[i] = 2;
    for (int i = 3; i * i < MAX; i++)
 
      // If i is prime
      if (spf[i] == i) {
 
        // Mark spf for all numbers
        // divisible by i
        for (int j = i * i; j < MAX; j = j + i) {
 
          // Mark spf[j] if it is
          // not previously marked
          if (spf[j] == j)
            spf[j] = i;
        }
      }
  }
 
  // Function to find the distinct
  // prime factors
  static void DistPrime()
  {
    for (int i = 1; i < MAX; i++) {
 
      int idx = 1;
      int x = i;
 
      // Push all distinct of x
      // prime factor in v[x]
      if (x != 1)
        v[i].add(spf[x]);
 
      x = x / spf[x];
 
      while (x != 1) {
 
        if (v[i].get(idx - 1) != spf[x]) {
 
          // Pushback into v[i]
          v[i].add(spf[x]);
 
          // Increment the idx
          idx += 1;
        }
 
        // Update x = (x / spf[x])
        x = x / spf[x];
      }
    }
  }
 
  // Function to get the distinct
  // factor count of arr[]
  static void getFactorCount(int arr[], int N)
  {
 
    // initialization
    spf = new int[MAX];
    v = new ArrayList[MAX];
    for (int i = 0; i < MAX; i++)
      v[i] = new ArrayList<>();
 
    // Precompute the smallest
    // Prime Factors
    sieve();
 
    // For distinct prime factors
    // Fill the v[] vector
    DistPrime();
 
    // Count of Distinct Prime
    // Factors of each array element
    for (int i = 0; i < N; i++) {
      System.out.print((int)v[arr[i]].size() + " ");
    }
  }
 
  // Driver Code
  public static void main(String[] args)
  {
 
    int arr[] = { 6, 9, 12 };
    int N = arr.length;
 
    getFactorCount(arr, N);
  }
}
 
// This code is contributed by Kingash.




MAX = 100001
 
# Stores smallest prime
# factor for every number
spf = [0] * MAX
 
# Stores distinct prime factors
v = [[] for _ in range(MAX)]
 
# Function to find the smallest
# prime factor of every number
def sieve():
 
    # Mark the smallest prime factor
    # of every number to itself
    for i in range(1, MAX):
        spf[i] = i
 
    # Separately mark all the
    # smallest prime factor of
    # every even number to be 2
    for i in range(4, MAX, 2):
        spf[i] = 2
    for i in range(3, int(MAX**0.5)+1):
 
        # If i is prime
        if spf[i] == i:
            # Mark spf for all numbers
            # divisible by i
            for j in range(i*i, MAX, i):
                # Mark spf[j] if it is
                # not previously marked
                if spf[j] == j:
                    spf[j] = i
 
# Function to find the distinct
# prime factors
def DistPrime():
    for i in range(1, MAX):
        idx = 1
        x = i
 
        # Push all distinct of x
        # prime factor in v[x]
        if x != 1:
            v[i].append(spf[x])
 
        x = x // spf[x]
 
        while x != 1:
            if v[i][idx-1] != spf[x]:
                # Pushback into v[i]
                v[i].append(spf[x])
 
                # Increment the idx
                idx += 1
 
            # Update x = (x / spf[x])
            x = x // spf[x]
 
# Function to get the distinct
# factor count of arr[]
def getFactorCount(arr, N):
    # Precompute the smallest
    # Prime Factors
    sieve()
 
    # For distinct prime factors
    # Fill the v[] vector
    DistPrime()
 
    # Count of Distinct Prime
    # Factors of each array element
    for i in range(N):
        print(len(v[arr[i]]), end=' ')
 
arr = [6, 9, 12]
N = len(arr)
 
getFactorCount(arr, N)
 
# This code is contributed by phasing17.




// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
  static int MAX = 100001;
 
  // Stores smallest prime
  // factor for every number
  static int[] spf;
 
  // Stores distinct prime factors
  static List<List<int>> v;
 
  // Function to find the smallest
  // prime factor of every number
  static void sieve()
  {
 
    // Mark the smallest prime factor
    // of every number to itself
    for (int i = 1; i < MAX; i++)
      spf[i] = i;
 
    // Separately mark all the
    // smallest prime factor of
    // every even number to be 2
    for (int i = 4; i < MAX; i = i + 2)
      spf[i] = 2;
    for (int i = 3; i * i < MAX; i++)
 
      // If i is prime
      if (spf[i] == i) {
 
        // Mark spf for all numbers
        // divisible by i
        for (int j = i * i; j < MAX; j = j + i) {
 
          // Mark spf[j] if it is
          // not previously marked
          if (spf[j] == j)
            spf[j] = i;
        }
      }
  }
 
  // Function to find the distinct
  // prime factors
  static void DistPrime()
  {
    for (int i = 1; i < MAX; i++) {
 
      int idx = 1;
      int x = i;
 
      // Push all distinct of x
      // prime factor in v[x]
      if (x != 1)
        v[i].Add(spf[x]);
 
      x = x / spf[x];
 
      while (x != 1) {
 
        if (v[i][idx - 1] != spf[x]) {
 
          // Pushback into v[i]
          v[i].Add(spf[x]);
 
          // Increment the idx
          idx += 1;
        }
 
        // Update x = (x / spf[x])
        x = x / spf[x];
      }
    }
  }
 
  // Function to get the distinct
  // factor count of arr[]
  static void getFactorCount(int[] arr, int N)
  {
 
    // initialization
    spf = new int[MAX];
    v = new List<List<int>>() ;
    for (int i = 0; i < MAX; i++)
      v.Add(new List<int>());
 
    // Precompute the smallest
    // Prime Factors
    sieve();
 
    // For distinct prime factors
    // Fill the v[] vector
    DistPrime();
 
    // Count of Distinct Prime
    // Factors of each array element
    for (int i = 0; i < N; i++) {
      Console.Write((int)v[arr[i]].Count + " ");
    }
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
 
    int[] arr = { 6, 9, 12 };
    int N = arr.Length;
 
    getFactorCount(arr, N);
  }
}
 
// This code is contributed by phasing17.




<script>
 
    // JavaScript program for the above approach
     
    let MAX = 100001;
  
    // Stores smallest prime
    // factor for every number
    let spf;
 
    // Stores distinct prime factors
    let v;
 
    // Function to find the smallest
    // prime factor of every number
    function sieve()
    {
 
      // Mark the smallest prime factor
      // of every number to itself
      for (let i = 1; i < MAX; i++)
        spf[i] = i;
 
      // Separately mark all the
      // smallest prime factor of
      // every even number to be 2
      for (let i = 4; i < MAX; i = i + 2)
        spf[i] = 2;
      for (let i = 3; i * i < MAX; i++)
 
        // If i is prime
        if (spf[i] == i) {
 
          // Mark spf for all numbers
          // divisible by i
          for (let j = i * i; j < MAX; j = j + i) {
 
            // Mark spf[j] if it is
            // not previously marked
            if (spf[j] == j)
              spf[j] = i;
          }
        }
    }
 
    // Function to find the distinct
    // prime factors
    function DistPrime()
    {
      for (let i = 1; i < MAX; i++) {
 
        let idx = 1;
        let x = i;
 
        // Push all distinct of x
        // prime factor in v[x]
        if (x != 1)
          v[i].push(spf[x]);
 
        x = parseInt(x / spf[x], 10);
 
        while (x != 1) {
 
          if (v[i][idx - 1] != spf[x]) {
 
            // Pushback into v[i]
            v[i].push(spf[x]);
 
            // Increment the idx
            idx += 1;
          }
 
          // Update x = (x / spf[x])
          x = parseInt(x / spf[x], 10);
        }
      }
    }
 
    // Function to get the distinct
    // factor count of arr[]
    function getFactorCount(arr, N)
    {
 
      // initialization
      spf = new Array(MAX);
      v = new Array(MAX);
      for (let i = 0; i < MAX; i++)
        v[i] = [];
 
      // Precompute the smallest
      // Prime Factors
      sieve();
 
      // For distinct prime factors
      // Fill the v[] vector
      DistPrime();
 
      // Count of Distinct Prime
      // Factors of each array element
      for (let i = 0; i < N; i++) {
        document.write(v[arr[i]].length + " ");
      }
    }
     
    let arr = [ 6, 9, 12 ];
    let N = arr.length;
  
    getFactorCount(arr, N);
   
</script>

Output
2 1 2






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


Article Tags :