给定二维数组arr[][]形式的Q查询,其每行由两个数字L和R 组成,表示范围 [L, R],任务是找到位于该范围内的所有完美平方的总和。
例子:
Input: Q = 2, arr[][] = {{4, 9}, {4, 16}}
Output: 13 29
Explanation:
From 4 to 9: only 4 and 9 are perfect squares. Therefore, 4 + 9 = 13.
From 4 to 16: 4, 9 and 16 are the perfect squares. Therefore, 4 + 9 + 16 = 29.
Input: Q = 4, arr[][] = {{1, 10}, {1, 100}, {2, 25}, {4, 50}}
Output: 14 385 54 139
方法:想法是使用前缀和数组。预先计算所有平方和并存储在数组pref[] 中,以便每个查询都可以在 O(1) 时间内得到回答。 pref[] 数组中的每个第 i 个索引表示从 1 到该数字的完美平方和。因此,从给定范围 ‘L’ 到 ‘R’ 的完美平方和可以找到如下:
sum = pref[R] - pref[L - 1]
下面是上述方法的实现:
CPP
// C++ program to find the sum of all
// perfect squares in the given range
#include
#define ll int
using namespace std;
// Array to precompute the sum of squares
// 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 square or not
int isPerfectSquare(long long int x)
{
// Find floating point value of
// square root of x.
long double sr = sqrt(x);
// If square root is an integer
return ((sr - floor(sr)) == 0) ? x : 0;
}
// Function to precompute the perfect
// squares upto 100000.
void compute()
{
for (int i = 1; i <= 100000; ++i) {
pref[i] = pref[i - 1]
+ isPerfectSquare(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 squares in the given range
class GFG
{
// Array to precompute the sum of squares
// from 1 to 100010 so that for every
// query, the answer can be returned in O(1).
static int []pref = new int[100010];
// Function to check if a number is
// a perfect square or not
static int isPerfectSquare(int x)
{
// Find floating point value of
// square root of x.
double sr = Math.sqrt(x);
// If square root is an integer
return ((sr - Math.floor(sr)) == 0) ? x : 0;
}
// Function to precompute the perfect
// squares upto 100000.
static void compute()
{
for (int i = 1; i <= 100000; ++i)
{
pref[i] = pref[i - 1]
+ isPerfectSquare(i);
}
}
// Function to print the sum for each query
static void printSum(int L, int R)
{
int 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 PrinciRaj1992
Python3
# Python3 program to find the sum of all
# perfect squares in the given range
from math import sqrt, floor
# Array to precompute the sum of squares
# 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 square or not
def isPerfectSquare(x) :
# Find floating point value of
# square root of x.
sr = sqrt(x);
# If square root is an integer
rslt = x if (sr - floor(sr) == 0) else 0;
return rslt;
# Function to precompute the perfect
# squares upto 100000.
def compute() :
for i in range(1 , 100001) :
pref[i] = pref[i - 1] + isPerfectSquare(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 squares in the given range
using System;
class GFG
{
// Array to precompute the sum of squares
// from 1 to 100010 so that for every
// query, the answer can be returned in O(1).
static int []pref = new int[100010];
// Function to check if a number is
// a perfect square or not
static int isPerfectSquare(int x)
{
// Find floating point value of
// square root of x.
double sr = Math.Sqrt(x);
// If square root is an integer
return ((sr - Math.Floor(sr)) == 0) ? x : 0;
}
// Function to precompute the perfect
// squares upto 100000.
static void compute()
{
for (int i = 1; i <= 100000; ++i)
{
pref[i] = pref[i - 1]
+ isPerfectSquare(i);
}
}
// Function to print the sum for each query
static void printSum(int L, int R)
{
int sum = pref[R] - pref[L - 1];
Console.Write(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 PrinciRaj1992
Javascript
输出:
14 385 54 139
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live