Sum of all Perfect Squares lying in the range [L, R] for Q queries
Last Updated :
30 Jan, 2022
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 squares lying in this range.
Examples:
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
Approach: The idea is to use a prefix sum array. The sum all squares are precomputed and stored in an array pref[] so that every query can be answered in O(1) time. Every ‘i’th index in the pref[] array represents the sum of perfect squares from 1 to that number. Therefore, the sum of perfect squares from the given range ‘L’ to ‘R’ can be found as follows:
sum = pref[R] - pref[L - 1]
Below is the implementation of the above approach:
CPP
#include <bits/stdc++.h>
#define ll int
using namespace std;
long long pref[100010];
int isPerfectSquare( long long int x)
{
long double sr = sqrt (x);
return ((sr - floor (sr)) == 0) ? x : 0;
}
void compute()
{
for ( int i = 1; i <= 100000; ++i) {
pref[i] = pref[i - 1]
+ isPerfectSquare(i);
}
}
void printSum( int L, int R)
{
int sum = pref[R] - pref[L - 1];
cout << sum << " " ;
}
int main()
{
compute();
int Q = 4;
int arr[][2] = { { 1, 10 },
{ 1, 100 },
{ 2, 25 },
{ 4, 50 } };
for ( int i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
return 0;
}
|
Java
class GFG
{
static int []pref = new int [ 100010 ];
static int isPerfectSquare( int x)
{
double sr = Math.sqrt(x);
return ((sr - Math.floor(sr)) == 0 ) ? x : 0 ;
}
static void compute()
{
for ( int i = 1 ; i <= 100000 ; ++i)
{
pref[i] = pref[i - 1 ]
+ isPerfectSquare(i);
}
}
static void printSum( int L, int R)
{
int sum = pref[R] - pref[L - 1 ];
System.out.print(sum+ " " );
}
public static void main(String[] args)
{
compute();
int Q = 4 ;
int arr[][] = { { 1 , 10 },
{ 1 , 100 },
{ 2 , 25 },
{ 4 , 50 } };
for ( int i = 0 ; i < Q; i++)
{
printSum(arr[i][ 0 ], arr[i][ 1 ]);
}
}
}
|
Python3
from math import sqrt, floor
pref = [ 0 ] * 100010 ;
def isPerfectSquare(x) :
sr = sqrt(x);
rslt = x if (sr - floor(sr) = = 0 ) else 0 ;
return rslt;
def compute() :
for i in range ( 1 , 100001 ) :
pref[i] = pref[i - 1 ] + isPerfectSquare(i);
def printSum( L, R) :
sum = pref[R] - pref[L - 1 ];
print ( sum ,end = " " );
if __name__ = = "__main__" :
compute();
Q = 4 ;
arr = [ [ 1 , 10 ],
[ 1 , 100 ],
[ 2 , 25 ],
[ 4 , 50 ] ];
for i in range (Q) :
printSum(arr[i][ 0 ], arr[i][ 1 ]);
|
C#
using System;
class GFG
{
static int []pref = new int [100010];
static int isPerfectSquare( int x)
{
double sr = Math.Sqrt(x);
return ((sr - Math.Floor(sr)) == 0) ? x : 0;
}
static void compute()
{
for ( int i = 1; i <= 100000; ++i)
{
pref[i] = pref[i - 1]
+ isPerfectSquare(i);
}
}
static void printSum( int L, int R)
{
int sum = pref[R] - pref[L - 1];
Console.Write(sum+ " " );
}
public static void Main(String[] args)
{
compute();
int Q = 4;
int [,]arr = { { 1, 10 },
{ 1, 100 },
{ 2, 25 },
{ 4, 50 } };
for ( int i = 0; i < Q; i++)
{
printSum(arr[i, 0], arr[i, 1]);
}
}
}
|
Javascript
<script>
var pref= Array(100010).fill(0);
function isPerfectSquare(x)
{
var sr = Math.sqrt(x);
return ((sr - Math.floor(sr)) == 0) ? x : 0;
}
function compute()
{
for ( var i = 1; i <= 100000; ++i) {
pref[i] = pref[i - 1]
+ isPerfectSquare(i);
}
}
function printSum(L, R)
{
var sum = pref[R] - pref[L - 1];
document.write(sum + " " );
}
compute();
var Q = 4;
arr = [ [ 1, 10 ],
[ 1, 100 ],
[ 2, 25 ],
[ 4, 50 ] ];
for ( var i = 0; i < Q; i++)
printSum(arr[i][0], arr[i][1]);
</script>
|
Time Complexity: O(Q + 10000 * x)
Auxiliary Space: O(100010)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...