Count divisors of array multiplication
Last Updated :
19 Sep, 2023
Given an array with N elements, the task is to find the count of factors of a number X, which is the product of all array elements.
Examples:
Input : 5 5
Output : 3
5 * 5 = 25, the factors of 25 are 1, 5, 25
whose count is 3
Input : 3 5 7
Output : 8
3 * 5 * 7 = 105, the factors of 105 are 1,
3, 5, 7, 15, 21, 35, 105 whose count is 8
Method 1 (Simple but causes overflow):
- Multiply all the elements of the array.
- Count divisors in the number obtained after multiplication.
Implementation:
C++
// A simple C++ program to count divisors
// in array multiplication.
#include <iostream>
using namespace std;
// To count number of factors in a number
int counDivisors(int X)
{
// Initialize count with 0
int count = 0;
// Increment count for every factor
// of the given number X.
for (int i = 1; i <= X; ++i) {
if (X % i == 0) {
count++;
}
}
// Return number of factors
return count;
}
// Returns number of divisors in array
// multiplication
int countDivisorsMult(int arr[], int n)
{
// Multiplying all elements of
// the given array.
int mul = 1;
for (int i = 0; i < n; ++i)
mul *= arr[i];
// Calling function which count number of factors
// of the number
return counDivisors(mul);
}
// Driver code
int main()
{
int arr[] = { 2, 4, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << countDivisorsMult(arr, n) << endl;
return 0;
}
Java
// A simple Java program to count divisors
// in array multiplication.
class GFG
{
// To count number of factors in a number
static int counDivisors(int X)
{
// Initialize count with 0
int count = 0;
// Increment count for every factor
// of the given number X.
for (int i = 1; i <= X; ++i)
{
if (X % i == 0) {
count++;
}
}
// Return number of factors
return count;
}
// Returns number of divisors in array
// multiplication
static int countDivisorsMult(int arr[], int n)
{
// Multiplying all elements of
// the given array.
int mul = 1;
for (int i = 0; i < n; ++i)
mul *= arr[i];
// Calling function which count
// number of factors of the number
return counDivisors(mul);
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 2, 4, 6 };
int n = arr.length;
System.out.println(countDivisorsMult(arr, n));
}
}
// This code is contributed by Anant Agarwal.
Python3
# A simple Python program
# to count divisors
# in array multiplication.
# To count number of
# factors in a number
def counDivisors(X):
# Initialize count with 0
count = 0
# Increment count for
# every factor
# of the given number X.
for i in range(1, X + 1):
if (X % i == 0):
count += 1
# Return number of factors
return count
# Returns number of
# divisors in array
# multiplication
def countDivisorsMult(arr, n):
# Multiplying all elements of
# the given array.
mul = 1
for i in range(n):
mul *= arr[i]
# Calling function which
# count number of factors
# of the number
return counDivisors(mul)
# Driver code
arr = [ 2, 4, 6 ]
n =len(arr)
print(countDivisorsMult(arr, n))
# This code is contributed
# by Anant Agarwal.
C#
// C# program to count divisors
// in array multiplication.
using System;
class GFG {
// To count number of factors
// in a number
static int counDivisors(int X)
{
// Initialize count with 0
int count = 0;
// Increment count for every
// factor of the given
// number X.
for (int i = 1; i <= X; ++i)
{
if (X % i == 0) {
count++;
}
}
// Return number of factors
return count;
}
// Returns number of divisors in
// array multiplication
static int countDivisorsMult(
int []arr, int n)
{
// Multiplying all elements
// of the given array.
int mul = 1;
for (int i = 0; i < n; ++i)
mul *= arr[i];
// Calling function which
// count number of factors
// of the number
return counDivisors(mul);
}
// Driver code
public static void Main ()
{
int []arr = { 2, 4, 6 };
int n = arr.Length;
Console.Write(
countDivisorsMult(arr, n));
}
}
// This code is contributed by
// nitin mittal.
PHP
<?php
// A simple PHP program to count divisors
// in array multiplication.
// To count number of factors in a number
function counDivisors($X)
{
// Initialize count with 0
$count = 0;
// Increment count for every factor
// of the given number X.
for ($i = 1; $i <= $X; ++$i) {
if ($X % $i == 0) {
$count++;
}
}
// Return number of factors
return $count;
}
// Returns number of divisors in array
// multiplication
function countDivisorsMult($arr, $n)
{
// Multiplying all elements of
// the given array.
$mul = 1;
for ($i = 0; $i < $n; ++$i)
$mul *= $arr[$i];
// Calling function which count
// number of factors of the number
return counDivisors($mul);
}
// Driver code
$arr = array(2, 4, 6);
$n = sizeof($arr);
echo countDivisorsMult($arr, $n);
// This code is contributed by nitin mittal
?>
JavaScript
<script>
// Javascript program to count divisors
// in array multiplication.
// To count number of factors in a number
function counDivisors(X)
{
// Initialize count with 0
let count = 0;
// Increment count for every factor
// of the given number X.
for (let i = 1; i <= X; ++i)
{
if (X % i == 0) {
count++;
}
}
// Return number of factors
return count;
}
// Returns number of divisors in array
// multiplication
function countDivisorsMult(arr, n)
{
// Multiplying all elements of
// the given array.
let mul = 1;
for (let i = 0; i < n; ++i)
mul *= arr[i];
// Calling function which count
// number of factors of the number
return counDivisors(mul);
}
// driver function
let arr = [ 2, 4, 6 ];
let n = arr.length;
document.write(countDivisorsMult(arr, n));
// This code is contributed by code_hunt.
</script>
Time Complexity: O(m), m is the multiplication of all elements of array
Auxiliary Space: O(1)
Method 2 (Avoids overflow):
- Find a maximum element in the array
- Find prime numbers smaller than the maximum element
- Find the number of overall occurrences of each prime factor in the whole array by traversing all array elements and finding their prime factors. We use hashing to count occurrences.
- Let the counts of occurrences of prime factors be a1, a2, ...aK, if we have K distinct prime factors, then the answer will be: (a1+1)(a2+1)(...)*(aK+1).
Implementation:
C++
// C++ program to count divisors in array multiplication.
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes(int largest, vector<int> &prime)
{
// Create a boolean array "isPrime[0..n]" and initialize
// all entries it as true. A value in isPrime[i] will
// finally be false if i is Not a isPrime, else true.
bool isPrime[largest+1];
memset(isPrime, true, sizeof(isPrime));
for (int p = 2; p * p <= largest; p++)
{
// If isPrime[p] is not changed, then it is a isPrime
if (isPrime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= largest; i += p)
isPrime[i] = false;
}
}
// Print all isPrime numbers
for (int p = 2; p <= largest; p++)
if (isPrime[p])
prime.push_back(p);
}
// Returns number of divisors in array
// multiplication
int countDivisorsMult(int arr[], int n)
{
// Find all prime numbers smaller than
// the largest element.
int largest = *max_element(arr, arr+n);
vector<int> prime;
SieveOfEratosthenes(largest, prime);
// Find counts of occurrences of each prime
// factor
unordered_map<int, int> mp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < prime.size(); j++)
{
while(arr[i] > 1 && arr[i]%prime[j] == 0)
{
arr[i] /= prime[j];
mp[prime[j]]++;
}
}
if (arr[i] != 1)
mp[arr[i]]++;
}
// Compute count of all divisors using counts
// prime factors.
long long int res = 1;
for (auto it : mp)
res *= (it.second + 1L);
return res;
}
// Driver code
int main()
{
int arr[] = { 2, 4, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << countDivisorsMult(arr, n) << endl;
return 0;
}
Java
// Java program to count divisors in array multiplication.
import java.io.*;
import java.util.*;
class GFG
{
static void SieveOfEratosthenes(int largest, ArrayList<Integer> prime)
{
// Create a boolean array "isPrime[0..n]" and initialize
// all entries it as true. A value in isPrime[i] will
// finally be false if i is Not a isPrime, else true.
boolean[] isPrime = new boolean[largest + 1];
Arrays.fill(isPrime, true);
for (int p = 2; p * p <= largest; p++)
{
// If isPrime[p] is not changed, then it is a isPrime
if (isPrime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= largest; i += p)
isPrime[i] = false;
}
}
// Print all isPrime numbers
for (int p = 2; p <= largest; p++)
if (isPrime[p])
prime.add(p);
}
// Returns number of divisors in array
// multiplication
static long countDivisorsMult(int[] arr, int n)
{
// Find all prime numbers smaller than
// the largest element.
int largest = 0;
for(int a : arr )
{
largest=Math.max(largest, a);
}
ArrayList<Integer> prime = new ArrayList<Integer>();
SieveOfEratosthenes(largest, prime);
// Find counts of occurrences of each prime
// factor
Map<Integer,Integer> mp = new HashMap<>();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < prime.size(); j++)
{
while(arr[i] > 1 && arr[i]%prime.get(j) == 0)
{
arr[i] /= prime.get(j);
if(mp.containsKey(prime.get(j)))
{
mp.put(prime.get(j), mp.get(prime.get(j)) + 1);
}
else
{
mp.put(prime.get(j), 1);
}
}
}
if (arr[i] != 1)
{
if(mp.containsKey(arr[i]))
{
mp.put(arr[i], mp.get(arr[i]) + 1);
}
else
{
mp.put(arr[i], 1);
}
}
}
// Compute count of all divisors using counts
// prime factors.
long res = 1;
for (int it : mp.keySet())
res *= (mp.get(it) + 1L);
return res;
}
// Driver code
public static void main (String[] args) {
int arr[] = { 2, 4, 6 };
int n = arr.length;
System.out.println(countDivisorsMult(arr, n));
}
}
// This code is contributed by avanitrachhadiya2155
Python3
# Python 3 program to count divisors in array multiplication.
from collections import defaultdict
def SieveOfEratosthenes(largest, prime):
# Create a boolean array "isPrime[0..n]" and initialize
# all entries it as true. A value in isPrime[i] will
# finally be false if i is Not a isPrime, else true.
isPrime = [True] * (largest + 1)
p = 2
while p * p <= largest:
# If isPrime[p] is not changed, then it is a isPrime
if (isPrime[p] == True):
# Update all multiples of p
for i in range(p * 2, largest + 1, p):
isPrime[i] = False
p += 1
# Print all isPrime numbers
for p in range(2, largest + 1):
if (isPrime[p]):
prime.append(p)
# Returns number of divisors in array
# multiplication
def countDivisorsMult(arr, n):
# Find all prime numbers smaller than
# the largest element.
largest = max(arr)
prime = []
SieveOfEratosthenes(largest, prime)
# Find counts of occurrences of each prime
# factor
mp = defaultdict(int)
for i in range(n):
for j in range(len(prime)):
while(arr[i] > 1 and arr[i] % prime[j] == 0):
arr[i] //= prime[j]
mp[prime[j]] += 1
if (arr[i] != 1):
mp[arr[i]] += 1
# Compute count of all divisors using counts
# prime factors.
res = 1
for it in mp.values():
res *= (it + 1)
return res
# Driver code
if __name__ == "__main__":
arr = [2, 4, 6]
n = len(arr)
print(countDivisorsMult(arr, n))
# This code is contributed by chitranayal.
C#
// C# program to count divisors in array multiplication.
using System;
using System.Collections.Generic;
class GFG{
static void SieveOfEratosthenes(int largest,
List<int> prime)
{
// Create a boolean array "isPrime[0..n]" and initialize
// all entries it as true. A value in isPrime[i] will
// finally be false if i is Not a isPrime, else true.
bool[] isPrime = new bool[largest + 1];
Array.Fill(isPrime, true);
for(int p = 2; p * p <= largest; p++)
{
// If isPrime[p] is not changed, then it is a isPrime
if (isPrime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= largest; i += p)
isPrime[i] = false;
}
}
// Print all isPrime numbers
for(int p = 2; p <= largest; p++)
if (isPrime[p])
prime.Add(p);
}
// Returns number of divisors in array
// multiplication
static long countDivisorsMult(int[] arr, int n)
{
// Find all prime numbers smaller than
// the largest element.
int largest = 0;
foreach(int a in arr )
{
largest = Math.Max(largest, a);
}
List<int> prime = new List<int>();
SieveOfEratosthenes(largest, prime);
// Find counts of occurrences of each prime
// factor
Dictionary<int,
int> mp = new Dictionary<int,
int>();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < prime.Count; j++)
{
while(arr[i] > 1 && arr[i] % prime[j] == 0)
{
arr[i] /= prime[j];
if (mp.ContainsKey(prime[j]))
{
mp[prime[j]]++;
}
else
{
mp.Add(prime[j], 1);
}
}
}
if (arr[i] != 1)
{
if(mp.ContainsKey(arr[i]))
{
mp[arr[i]]++;
}
else
{
mp.Add(arr[i], 1);
}
}
}
// Compute count of all divisors using counts
// prime factors.
long res = 1;
foreach(KeyValuePair<int, int> it in mp)
res *= (it.Value + 1L);
return res;
}
// Driver code
static public void Main()
{
int[] arr = { 2, 4, 6 };
int n = arr.Length;
Console.WriteLine(countDivisorsMult(arr, n));
}
}
// This code is contributed by rag2127
JavaScript
<script>
// javascript program to count divisors in array multiplication.
function SieveOfEratosthenes(largest, prime)
{
// Create a boolean array "isPrime[0..n]" and initialize
// all entries it as true. A value in isPrime[i] will
// finally be false if i is Not a isPrime, else true.
var isPrime = Array(largest+1).fill(true);
var p,i;
for (p = 2; p * p <= largest; p++)
{
// If isPrime[p] is not changed, then it is a isPrime
if (isPrime[p] == true)
{
// Update all multiples of p
for(i = p * 2; i <= largest; i += p)
isPrime[i] = false;
}
}
// Print all isPrime numbers
for (p = 2; p <= largest; p++)
if (isPrime[p])
prime.push(p);
}
// Returns number of divisors in array
// multiplication
function countDivisorsMult(arr, n)
{
// Find all prime numbers smaller than
// the largest element.
var largest = Math.max.apply(null,arr);
var prime = [];
SieveOfEratosthenes(largest, prime);
// Find counts of occurrences of each prime
// factor
var j;
var mp = new Map();
for (i = 0; i < n; i++)
{
for (j = 0; j < prime.length; j++)
{
while(arr[i] > 1 && arr[i]%prime[j] == 0)
{
arr[i] /= prime[j];
if(mp.has(prime[j]))
mp.set(prime[j],mp.get(prime[j])+1);
else
mp.set(prime[j],1);
}
}
if (arr[i] != 1){
if(mp.has(arr[i]))
mp.set(arr[i],mp.get(arr[i])+1);
else
mp.set(arr[i],1);
}
}
// Compute count of all divisors using counts
// prime factors.
var res = 1;
for (const [key, value] of mp.entries()) {
res *= (value + 1);
}
return res;
}
// Driver code
var arr = [2, 4, 6];
var n = arr.length;
document.write(countDivisorsMult(arr, n));
</script>
Time Complexity: O(n2)
Auxiliary Space: O(n)
Similar Reads
Count array elements having exactly K divisors Given an array arr[] consisting of N integers and an integer K, the task is to count the number of array elements having exactly K divisors. Examples: Input: N = 5, arr[] = { 3, 6, 2, 9, 4 }, K = 2Output: 2Explanation: arr[0] (= 3) and arr[2] (= 2) have exactly 2 divisors. Input: N = 5, arr[] = { 3,
14 min read
Count divisible pairs in an array Given an array, count pairs in the array such that one element of the pair divides the other. Examples: Input : arr[] = {1, 2, 3} Output : 2 The two pairs are (1, 2) and (1, 3) Input : arr[] = {2, 3, 5, 7} Output: 0 Naive Approach: The brute force approach can be implemented by iterating through eve
10 min read
Count Divisors of n in O(n^1/3) Given a number n, count all distinct divisors of it. Examples: Input : 18 Output : 6 Divisors of 18 are 1, 2, 3, 6, 9 and 18. Input : 100 Output : 9 Divisors of 100 are 1, 2, 4, 5, 10, 20, 25, 50 and 100Recommended: Please solve it on âPRACTICE â first, before moving on to the solution. Approach 1:
15+ min read
Queries for counts of multiples in an array Given an array of positive integers and many queries for divisibility. In every query, we are given an integer k ( > 0), we need to count all elements in the array which are perfectly divisible by 'k'. Example: Input:2 4 9 15 21 20k = 2k = 3k = 5Output:332Explanation:Multiples of '2' in array are
9 min read
Sum of multiplication of triplet of divisors of a number Given an array arr[] of integers of size n. For each element, you have to print the summation of multiplication of every triplet formed using divisors of this element.Examples: Input: arr[] = {4} Output: 8 4 has three divisors 1, 2 and 4. 1 * 2 * 4 = 8Input: arr[] = {9, 5, 6} Output: 27 0 72 9 has t
13 min read