📌  相关文章
📜  Q查询中位于[L,R]范围内的所有Perfect Cubes的总和

📅  最后修改于: 2021-04-29 09:27:54             🧑  作者: Mango

给定2D数组arr [] []的形式的Q查询,其每行包含两个数字LR ,这两个数字表示范围[L,R],任务是查找该范围内所有理想立方体的总和。
例子:

方法:想法是使用前缀和数组。

  1. 所有多维数据集的总和已预先计算并存储在数组pref []中,以便可以在O(1)时间内回答每个查询。
  2. pref []数组中的每个i索引代表从1到该数字的理想立方体的总和。
  3. 因此,可以从前缀求和数组pref []中找到从给定范围’L’到’R’的理想立方体的总和。

下面是上述方法的实现:

C++
// C++ program to find the sum of all
// perfect cubes in the given range
 
#include 
#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;
}


Java
// 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


Python3
# 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


C#
// 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


Javascript


输出:
9 100 8 35