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
// C++ program to find the sum of all // perfect squares in the given range #include <bits/stdc++.h> #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
<script> // Javascript program to find the sum of all // perfect squares in the given range // Array to precompute the sum of squares // from 1 to 100010 so that for every // query, the answer can be returned in O(1). var pref= Array(100010).fill(0); // Function to check if a number is // a perfect square or not function isPerfectSquare(x) { // Find floating point value of // square root of x. var 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. function compute() { for ( var i = 1; i <= 100000; ++i) { pref[i] = pref[i - 1] + isPerfectSquare(i); } } // Function to print the sum for each query function printSum(L, R) { var sum = pref[R] - pref[L - 1]; document.write(sum + " " ); } // Driver code // To calculate the precompute function compute(); var Q = 4; arr = [ [ 1, 10 ], [ 1, 100 ], [ 2, 25 ], [ 4, 50 ] ]; // Calling the printSum function // for every query for ( var i = 0; i < Q; i++) printSum(arr[i][0], arr[i][1]); </script> |
14 385 54 139
Time Complexity: O(Q + 10000 * x)
Auxiliary Space: O(100010)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!