Sum of all Perfect Cubes lying in the range [L, R] for Q queries

Given Q queries in the form of 2D array arr[][] whose every row consists of two numbers L and R which signifies the range [L, R], the task is to find the sum of all perfect cubes lying in this range.

Examples:

Input: Q = 2, arr[][] = {{4, 9}, {4, 44}}
Output: 8 35
From 4 to 9: only 8 is the perfect cube. Therefore, 8 is the ans
From 4 to 44: 8, and 27 are the perfect cubes. Therefore, 8 + 27 = 35

Input: Q = 4, arr[][] = {{ 1, 10 }, { 1, 100 }, { 2, 25 }, { 4, 50 }}
Output: 9 100 8 35

Approach: The idea is to use a prefix sum array.



  1. The sum all cubes are precomputed and stored in an array pref[] so that every query can be answered in O(1) time.
  2. Every ith index in the pref[] array represents the sum of perfect cubes from 1 to that number.
  3. Therefore, the sum of perfect cubes from the given range ‘L’ to ‘R’ can be found as from the prefix sum array pref[].

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the sum of all
// perfect cubes in the given range
  
#include <bits/stdc++.h>
#define ll int
using namespace std;
  
// Array to precompute the sum of cubes
// from 1 to 100010 so that for every
// query, the answer can be returned in O(1).
long long pref[100010];
  
// Function to check if a number is
// a perfect Cube or not
int isPerfectCube(long long int x)
{
    // Find floating point value of
    // cube root of x.
    long double cr = round(cbrt(x));
  
    // If cube root of x is cr
    // return the x, else 0
    return (cr * cr * cr == x) ? x : 0;
}
  
// Function to precompute the perfect
// Cubes upto 100000.
void compute()
{
    for (int i = 1; i <= 100000; ++i) {
        pref[i] = pref[i - 1]
                  + isPerfectCube(i);
    }
}
  
// Function to print the sum for each query
void printSum(int L, int R)
{
    int sum = pref[R] - pref[L - 1];
    cout << sum << " ";
}
  
// Driver code
int main()
{
    // To calculate the precompute function
    compute();
  
    int Q = 4;
    int arr[][2] = { { 1, 10 },
                     { 1, 100 },
                     { 2, 25 },
                     { 4, 50 } };
  
    // Calling the printSum function
    // for every query
    for (int i = 0; i < Q; i++) {
        printSum(arr[i][0], arr[i][1]);
    }
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the sum of all
// perfect cubes in the given range
import java.util.*;
import java.lang.*;
import java.io.*;
  
/* Name of the class has to be "Main" only if the class is public. */
class GFG
{
    // Array to precompute the sum of cubes
    // from 1 to 100010 so that for every
    // query, the answer can be returned in O(1).
     public static int []pref=new int[100010];
        
    // Function to check if a number is
    // a perfect Cube or not
    static int isPerfectCube(int x)
    {
        // Find floating point value of
        // cube root of x.
        double cr = Math.round(Math.cbrt(x));
        
        // If cube root of x is cr
        // return the x, else 0
        if(cr*cr*cr==(double)x) return x;
        return 0;
    }
        
    // Function to precompute the perfect
    // Cubes upto 100000.
    static void compute()
    {
        for (int i = 1; i <= 100000; ++i) {
            pref[i] = pref[i - 1]+ isPerfectCube(i);
        }
    }
        
    // Function to print the sum for each query
    static void printSum(int L, int R)
    {
        long sum = pref[R] - pref[L - 1];
        System.out.print(sum+" ");
    }
        
    
     
    // Driver code
    public static void main (String[] args) 
    {
         // To calculate the precompute function
        compute();
        
        int Q = 4;
        int [][] arr = { { 1, 10 },
                                { 1, 100 },
                                { 2, 25 },
                                { 4, 50 } };
        
        // Calling the printSum function
        // for every query
        for (int i = 0; i < Q; i++) {
            printSum(arr[i][0], arr[i][1]);
        }
    }
}
  
// This code is contributed by chitranayal

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the sum of all 
# perfect cubes in the given range 
  
# Array to precompute the sum of cubes 
# from 1 to 100010 so that for every 
# query, the answer can be returned in O(1). 
pref = [0]*100010
  
# Function to check if a number is 
# a perfect Cube or not 
def isPerfectCube(x) : 
  
    # Find floating point value of 
    # cube root of x. 
    cr = round(x**(1/3)); 
  
    # If cube root of x is cr 
    # return the x, else 0 
    rslt = x if (cr * cr * cr == x) else 0
    return rslt;
  
# Function to precompute the perfect 
# Cubes upto 100000. 
def compute() :
    for i in range(1, 100001) : 
        pref[i] = pref[i - 1] + isPerfectCube(i); 
  
# Function to print the sum for each query 
def printSum(L, R) : 
  
    sum = pref[R] - pref[L - 1]; 
    print(sum ,end= " "); 
  
# Driver code 
if __name__ == "__main__"
  
    # To calculate the precompute function 
    compute(); 
  
    Q = 4
    arr= [ [ 1, 10 ], 
            [ 1, 100 ], 
            [ 2, 25 ], 
            [ 4, 50 ] ]; 
  
    # Calling the printSum function 
    # for every query 
    for i in range(Q) :
        printSum(arr[i][0], arr[i][1]); 
  
# This code is contributed by AnkitRai01

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the sum of all
// perfect cubes in the given range
using System; 
        
class GFG { 
// Array to precompute the sum of cubes
// from 1 to 100010 so that for every
// query, the answer can be returned in O(1).
 public static long []pref=new long[100010];
   
// Function to check if a number is
// a perfect Cube or not
static long isPerfectCube(long x)
{
    // Find floating point value of
    // cube root of x.
    double cr = Math.Round(MathF.Cbrt(x));
   
    // If cube root of x is cr
    // return the x, else 0
    if(cr*cr*cr==(double)x) return x;
    return 0;
}
   
// Function to precompute the perfect
// Cubes upto 100000.
static void compute()
{
    for (long i = 1; i <= 100000; ++i) {
        pref[i] = pref[i - 1]
                  + isPerfectCube(i);
    }
}
   
// Function to print the sum for each query
static void printSum(int L, int R)
{
    long sum = pref[R] - pref[L - 1];
    Console.Write(sum+" ");
}
   
// Driver code
public static void Main() 
  
    // To calculate the precompute function
    compute();
   
    int Q = 4;
    int [,] arr = new int[,]{ { 1, 10 },
                            { 1, 100 },
                            { 2, 25 },
                            { 4, 50 } };
   
    // Calling the printSum function
    // for every query
    for (int i = 0; i < Q; i++) {
        printSum(arr[i,0], arr[i,1]);
    }
  }
}  
  
// This code is contributed by mohit kumar 29

chevron_right


Output:

9 100 8 35

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.