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
6 min read
Sort an array according to the increasing count of distinct Prime Factors
Given an array of integers. The task is to sort the given array on the basis of increasing count of distinct prime factors. Examples: Input : arr[] = {30, 2, 1024, 210, 3, 6} Output : 2 1024 3 6 30 210 Input : arr[] = {12, 16, 27, 6} Output : 16 27 6 12 A naive approach is to find all the prime fact
9 min read
Count number of pairs not divisible by any element in the array
Given an array arr[] of size N, the task is to count the number of pairs of integers (i, j) for which there does not exist an integer k such that arr[i] is divisible by arr[k] and arr[j] is divisible by arr[k], such that k can be any index between [0, N - 1]. Examples: Input: N = 4, arr[] = {2, 4, 5
5 min read
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: 2Explanation:The count of divisors for each element are: arr[0]( = 3): 3 has 2 divisors i.e., 1 and 3.arr[1](
9 min read
Count the divisors or multiples present in the Array for each element
Given an array A[] with N integers, for each integer A[i] in the array, the task is to find the number of integers A[j] (j != i) in the array such that A[i] % A[j] = 0 or A[j] % A[i] = 0. Examples: Input: A = {2, 3, 4, 5, 6}Output: 2 1 1 0 2Explanation: For i=0, the valid indices are 2 and 4 as 4%2
8 min read