Count distinct prime factors for each element of an array
Last Updated :
02 Nov, 2023
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-
- Run a loop over the given array to find the count of distinct prime factors of each element
- For finding the count of distinct prime factors of each element-
- Initialize a variable count with a value of 0
- First, check if the number can be divided by 2. If it can be then divide it by 2 till it can be divided and after that increment the count by 1.
- Then check for all odd numbers from 3 till its square root that it can divide the number or not
- If any odd number can divide then it should divide till it can and after that increment count by 1 for each odd number
- In last, if still we have number>2 then this number that is remaining is any prime number so increment count by 1
- In the last print/return the count
Code-
C++
// 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;
}
Java
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);
}
}
Python3
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)
C#
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
// 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
- Initialize a vector, say v, to store the distinct prime factors.
- Store the Smallest Prime Factor(SPF) up to 105 using a Sieve of Eratosthenes.
- Calculate the distinct prime factors of all the numbers by dividing the numbers recursively with their smallest prime factor till it reduces to 1 and store distinct prime factors of X, in v[X].
- Traverse the array arr[] and for each array element, print the count as v[arr[i]].size().
Below is the implementation of the above approach :
C++14
// 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
// 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.
Python3
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#
// 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.
JavaScript
<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>
Time Complexity: O(N * log N)
Auxiliary Space: O(N)
Similar Reads
Maximize sum of count of distinct prime factors of K array elements Given an array arr[] of size N, the task is to find the maximum sum possible of the count of distinct prime factors of K array elements. Examples: Input: arr[] = {6, 9, 12}, K = 2Output: 4Explanation: Distinct prime factors of 6, 9, 12 are 2, 1, 2. K elements whose distinct prime factors are maximum
10 min read
Count pairs from an array with even product of count of distinct prime factors Given two arrays A[] and B[] consisting of N and M integers respectively, the task is to count pairs (A[i], B[j]) such that the product of their count of distinct prime factors is even. Examples: Input: A[] = {1, 2, 3}, B[] = {4, 5, 6}, N = 3, M = 3Output: 2Explanation: Replacing all array elements
11 min read
Prime factors of LCM of array elements Given an array arr[] such that 1 <= arr[i] <= 10^12, the task is to find prime factors of LCM of array elements. Examples: Input : arr[] = {1, 2, 3, 4, 5, 6, 7, 8} Output : 2 3 5 7 // LCM of n elements is 840 and 840 = 2*2*2*3*5*7 // so prime factors would be 2, 3, 5, 7 Input : arr[] = {20, 10
15+ min read
Count number of primes in an array Given an array arr[] of N positive integers. The task is to write a program to count the number of prime elements in the given array. Examples: Input: arr[] = {1, 3, 4, 5, 7} Output: 3 There are three primes, 3, 5 and 7 Input: arr[] = {1, 2, 3, 4, 5, 6, 7} Output: 4 Naive Approach: A simple solution
8 min read
Distinct Prime Factors of Array Product Given an array of integers. Let us say P is the product of elements of the array. Find the number of distinct prime factors of product P. Examples: Input : 1 2 3 4 5 Output : 3 Explanation: Here P = 1 * 2 * 3 * 4 * 5 = 120. Distinct prime divisors of 120 are 2, 3 and 5. So, the output is 3. Input :
7 min read
Count of distinct power of prime factor of N Given a positive integer N, the task is to find the total number of distinct power of prime factor of the given number N.Examples: Input: N = 216 Output: 4 Explanation: 216 can be expressed as 2 * 22 * 3 * 32. The factors satisfying the conditions are 2, 22, 3 and 32 as all of them are written as di
5 min read