给定2D数组arr [] []的形式的Q查询,其每行包含两个数字L和R ,这两个数字表示范围[L,R],任务是查找该范围内所有理想立方体的总和。
例子:
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
方法:想法是使用前缀和数组。
- 所有多维数据集的总和已预先计算并存储在数组pref []中,以便可以在O(1)时间内回答每个查询。
- pref []数组中的每个第i个索引代表从1到该数字的理想立方体的总和。
- 因此,可以从前缀求和数组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