Count of subarrays having product as a perfect cube - GeeksforGeeks

01 Nov, 2021
Given an array arr[] consisting of N positive integers, the task is to count the number of subarrays with product of its elements equal to a perfect cube.
Examples:
Input: arr[] = {1, 8, 4, 2}Output: 6Explanation:The subarrays with product of elements equal to a perfect cube are:
{1}. Therefore, product of subarray = 1 (= (1)3).
{1, 8}. Therefore, product of subarray = 8 ( = 23).
{8}. Therefore, product of subarray = 8 = (23).
{4, 2}. Therefore, product of subarray = 8 (= 23).
{8, 4, 2}. Therefore, product of subarray = 64 (= 43).
{1, 8, 4, 2}. Therefore, product of subarray = 64 (= 43).
Therefore, the total count is 6.
Input: arr[] = {10, 10,10}Output: 1
Naive Approach: The simplest approach is to generate all possible subarrays from the given array and count those subarrays whose product of subarray elements is a perfect cube. After checking for all the subarrays, print the count obtained.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to check if a number// is perfect cube or notbool perfectCube(int N){    int cube_root;     // Find the cube_root    cube_root = (int)round(pow(N, 1.0 / 3.0));     // If cube of cube_root is    // same as N, then return true    if (cube_root * cube_root * cube_root == N) {        return true;    }     // Otherwise    return false;} // Function to count subarrays// whose product is a perfect cubevoid countSubarrays(int a[], int n){    // Store the required result    int ans = 0;     // Traverse all the subarrays    for (int i = 0; i < n; i++) {        int prod = 1;        for (int j = i; j < n; j++) {             prod = prod * a[j];             // If product of the current            // subarray is a perfect cube            if (perfectCube(prod))                 // Increment count                ans++;        }    }     // Print the result    cout << ans;} // Driver Codeint main(){    int arr[] = { 1, 8, 4, 2 };    int N = sizeof(arr) / sizeof(arr[0]);     countSubarrays(arr, N);     return 0;}
import java.util.*;public class GFG{  public static void main(String args[])  {    int arr[] = { 1, 8, 4, 2 };    int N = arr.length;    countSubarrays(arr, N);  }   // Function to count subarrays  // whose product is a perfect cube  static void countSubarrays(int a[], int n)  {         // Store the required result    int ans = 0;     // Traverse all the subarrays    for (int i = 0; i < n; i++)    {      int prod = 1;      for (int j = i; j < n; j++)      {         prod = prod * a[j];         // If product of the current        // subarray is a perfect cube        if (perfectCube(prod))           // Increment count          ans++;      }    }     // Print the result    System.out.println(ans);  }   // Function to check if a number  // is perfect cube or not  static boolean perfectCube(int N)  {    int cube_root;     // Find the cube_root    cube_root = (int)Math.round(Math.pow(N, 1.0 / 3.0));     // If cube of cube_root is    // same as N, then return true    if (cube_root * cube_root * cube_root == N)    {      return true;    }     // Otherwise    return false;  }} // This code is contributed by abhinavjain194.
# Python 3 program for the above approach # Function to check if a number# is perfect cube or notdef perfectCube(N):     # Find the cube_root    cube_root = round(pow(N, 1 / 3))     # If cube of cube_root is    # same as N, then return true    if (cube_root * cube_root * cube_root == N):        return True     # Otherwise    return False # Function to count subarrays# whose product is a perfect cubedef countSubarrays(a, n):     # Store the required result    ans = 0     # Traverse all the subarrays    for i in range(n):        prod = 1        for j in range(i, n):             prod = prod * a[j]             # If product of the current            # subarray is a perfect cube            if (perfectCube(prod)):                 # Increment count                ans += 1     # Print the result    print(ans) # Driver Codeif __name__ == "__main__":     arr = [1, 8, 4, 2]    N = len(arr)     countSubarrays(arr, N)     # This code is contributed by ukasp.
// C# program to implement// the above approachusing System;public class GFG{ // Driver Codepublic static void Main(String[] args){    int[] arr = { 1, 8, 4, 2 };    int N = arr.Length;    countSubarrays(arr, N);}   // Function to count subarrays  // whose product is a perfect cube  static void countSubarrays(int[] a, int n)  {         // Store the required result    int ans = 0;     // Traverse all the subarrays    for (int i = 0; i < n; i++)    {      int prod = 1;      for (int j = i; j < n; j++)      {         prod = prod * a[j];         // If product of the current        // subarray is a perfect cube        if (perfectCube(prod))           // Increment count          ans++;      }    }     // Print the result    Console.Write(ans);  }   // Function to check if a number  // is perfect cube or not  static bool perfectCube(int N)  {    int cube_root;     // Find the cube_root    cube_root = (int)Math.Round(Math.Pow(N, 1.0 / 3.0));     // If cube of cube_root is    // same as N, then return true    if (cube_root * cube_root * cube_root == N)    {      return true;    }     // Otherwise    return false;  }} // This code is contributed by souravghosh0416.
<script>  // Function to count subarrays  // whose product is a perfect cube  function countSubarrays(a , n)  {         // Store the required result    var ans = 0;     // Traverse all the subarrays    for (i = 0; i < n; i++)    {      var prod = 1;      for (j = i; j < n; j++)      {         prod = prod * a[j];         // If product of the current        // subarray is a perfect cube        if (perfectCube(prod))           // Increment count          ans++;      }    }     // Print the result    document.write(ans);  }   // Function to check if a number  // is perfect cube or not  function perfectCube(N)  {    var cube_root;     // Find the cube_root    cube_root = parseInt(Math.round(Math.pow(N, 1.0 / 3.0)));     // If cube of cube_root is    // same as N, then return true    if (cube_root * cube_root * cube_root == N)    {      return true;    }     // Otherwise    return false;  }   var arr = [ 1, 8, 4, 2 ];  var N = arr.length;  countSubarrays(arr, N); // This code is contributed by 29AjayKumar</script>
6
 
Time Complexity: O(N2)Auxiliary Space: O(1)
Efficient Approach: The above approach can also be optimized by storing the number of prime factors modulo 3 in a HashMap while traversing the array and count perfect cubes accordingly. Follow the steps below to solve the problem: 
Initialize a variable, say ans, to store the required result, and an array V with 0s to store the frequency of prime factors mod 3 for every element in the given array arr[].
Initialize a Hashmap, say M, to store the frequency of the current state of prime factors and increment V by 1 in the HashMap.
Traverse the array arr[] using the variable i perform the following steps:Store the frequency of prime factors mod 3 of arr[i] in V.Increment the value of ans by frequency of V in M and then increment the value of V in M.
Store the frequency of prime factors mod 3 of arr[i] in V.
Increment the value of ans by frequency of V in M and then increment the value of V in M.
After completing the above steps. print the value of ans as the result.
Below is the implementation of the above approach: 
C++14
Java
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;#define MAX 1e5 // Function to store the prime// factorization of a numbervoid primeFactors(vector<int>& v, int n){    for (int i = 2; i * i <= n; i++) {         // If N is divisible by i        while (n % i == 0) {             // Increment v[i] by 1 and            // calculate it modulo by 3            v[i]++;            v[i] %= 3;             // Divide the number by i            n /= i;        }    }     // If the number is not equal to 1    if (n != 1) {         // Increment v[n] by 1        v[n]++;         // Calculate it modulo 3        v[n] %= 3;    }} // Function to count the number of// subarrays whose product is a perfect cubevoid countSubarrays(int arr[], int n){    // Store the required result    int ans = 0;     // Stores the prime    // factors modulo 3    vector<int> v(MAX, 0);     // Stores the occurrences    // of the prime factors    map<vector<int>, int> mp;    mp[v]++;     // Traverse the array, arr[]    for (int i = 0; i < n; i++) {         // Store the prime factors        // and update the vector v        primeFactors(v, arr[i]);         // Update the answer        ans += mp[v];         // Increment current state        // of the prime factors by 1        mp[v]++;    }     // Print the result    cout << ans;} // Driver Codeint main(){    int arr[] = { 1, 8, 4, 2 };    int N = sizeof(arr) / sizeof(arr[0]);     countSubarrays(arr, N);     return 0;}
// Java program for the above approachimport java.io.*;import java.lang.*;import java.util.*; class GFG{ static int MAX = (int)(1e5); // To store the arr as a Key in mapstatic class Key{    int arr[];     Key(int arr[])    {        this.arr = arr;    }     @Override public int hashCode()    {        return 31 + Arrays.hashCode(arr);    }     @Override public boolean equals(Object obj)    {        if (this == obj)            return true;        if (obj == null ||           (getClass() != obj.getClass()))            return false;                     Key other = (Key)obj;                 if (!Arrays.equals(arr, other.arr))            return false;                     return true;    }} // Function to store the prime// factorization of a numberstatic void primeFactors(int v[], int n){    for(int i = 2; i * i <= n; i++)    {                 // If N is divisible by i        while (n % i == 0)        {                         // Increment v[i] by 1 and            // calculate it modulo by 3            v[i]++;            v[i] %= 3;             // Divide the number by i            n /= i;        }    }     // If the number is not equal to 1    if (n != 1)    {                 // Increment v[n] by 1        v[n]++;         // Calculate it modulo 3        v[n] %= 3;    }} // Function to count the number of// subarrays whose product is a perfect cubestatic void countSubarrays(int arr[], int n){         // Store the required result    int ans = 0;     // Stores the prime    // factors modulo 3    int v[] = new int[MAX];     // Stores the occurrences    // of the prime factors    HashMap<Key, Integer> mp = new HashMap<>();    mp.put(new Key(v), 1);     // Traverse the array, arr[]    for(int i = 0; i < n; i++)    {                 // Store the prime factors        // and update the vector v        primeFactors(v, arr[i]);         // Update the answer        ans += mp.getOrDefault(new Key(v), 0);         // Increment current state        // of the prime factors by 1        Key vv = new Key(v);        mp.put(vv, mp.getOrDefault(vv, 0) + 1);    }     // Print the result    System.out.println(ans);} // Driver Codepublic static void main(String[] args){    int arr[] = { 1, 8, 4, 2 };    int N = arr.length;     countSubarrays(arr, N);}} // This code is contributed by Kingash
6
 
Time Complexity: O(N3/2)Auxiliary Space: O(N)
 
ukasp
abhinavjain194
souravghosh0416
Kingash
29AjayKumar
ankita_saini
maths-perfect-cube
subarray
Technical Scripter 2020
Arrays
Mathematical
Searching
Technical Scripter
Arrays
Searching
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Window Sliding Technique
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Trapping Rain Water
Move all negative numbers to beginning and positive to end with constant extra space
Program for Fibonacci numbers
C++ Data Types
Write a program to print all permutations of a given string
Set in C++ Standard Template Library (STL)
Program to find GCD or HCF of two numbers