Sum of elements of an AP in the given range
Last Updated :
20 Sep, 2023
Given an arithmetic series in arr and Q queries in the form of [L, R], where L is the left boundary of the range and R is the right boundary. The task is to find the sum of the AP elements in the given range.
Note: The range is 1-indexed and 1 ? L, R ? N, where N is the size of arr.
Examples:
Input: arr[] = {2, 4, 6, 8, 10, 12, 14, 16}, Q = [[2, 4], [2, 6], [5, 8]]
Output:
18
40
52
Explanation:
Range 1: arr = {4, 6, 8}. Therefore sum = 18
Range 2: arr = {4, 6, 8, 10, 12}. Therefore sum = 40
Range 3: arr = {10, 12, 14, 16}. Therefore sum = 52
Input: arr[] = {7, 14, 21, 28, 35, 42}, Q = [[1, 6], [2, 4], [3, 3]]
Output:
147
63
21
Explanation:
Range 1: arr = {7, 14, 21, 28, 35, 42}. Therefore sum = 147
Range 2: arr = {14, 21, 28}. Therefore sum = 63
Range 3: arr = {21}. Therefore sum = 21
Approach: Since the given sequence is an arithmetic progression, the sum can be easily found in two steps efficiently:
- Multiply the first element of the range by the number of elements in the range.
- Add (d*k*(k+1))/2 to it, where d is the common difference of the AP and k is (number of elements in the range – 1) which corresponds to the number of gaps.
For example:
Suppose a[i] be the first element of the range, d is the common difference of AP and k+1 be the number of elements in the given range.
Then the sum of the range would be
= a[i] + a[i+1] + a[i+2] + ….. + a[i+k]
= a[i] + a[i] + d + a[i] + 2 * d + …. + a[i] + k * d
= a[i] * (k + 1) + d * (1 + 2 + … + k)
= a[i] * (k + 1) + (d * k * (k+1))/2
Below is the implementation of the above approach:
CPP
#include <bits/stdc++.h>
using namespace std;
int findSum( int * arr, int n,
int left, int right)
{
int k = right - left;
int d = arr[1] - arr[0];
int ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
int main()
{
int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16 };
int queries = 3;
int q[queries][2] = { { 2, 4 },
{ 2, 6 },
{ 5, 6 } };
int n = sizeof (arr) / sizeof (arr[0]);
for ( int i = 0; i < queries; i++)
cout << findSum(arr, n, q[i][0], q[i][1])
<< endl;
}
|
Java
class GFG{
static int findSum( int []arr, int n,
int left, int right)
{
int k = right - left;
int d = arr[ 1 ] - arr[ 0 ];
int ans = arr[left - 1 ] * (k + 1 );
ans = ans + (d * (k * (k + 1 ))) / 2 ;
return ans;
}
public static void main(String[] args)
{
int arr[] = { 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 };
int queries = 3 ;
int q[][] = { { 2 , 4 },
{ 2 , 6 },
{ 5 , 6 } };
int n = arr.length;
for ( int i = 0 ; i < queries; i++)
System.out.print(findSum(arr, n, q[i][ 0 ], q[i][ 1 ])
+ "\n" );
}
}
|
Python3
def findSum(arr, n, left, right):
k = right - left;
d = arr[ 1 ] - arr[ 0 ];
ans = arr[left - 1 ] * (k + 1 );
ans = ans + (d * (k * (k + 1 ))) / / 2 ;
return ans;
if __name__ = = '__main__' :
arr = [ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 ];
queries = 3 ;
q = [[ 2 , 4 ],[ 2 , 6 ],[ 5 , 6 ]];
n = len (arr);
for i in range (queries):
print (findSum(arr, n, q[i][ 0 ], q[i][ 1 ]));
|
C#
using System;
class GFG{
static int findSum( int []arr, int n,
int left, int right)
{
int k = right - left;
int d = arr[1] - arr[0];
int ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
public static void Main(String[] args)
{
int []arr = { 2, 4, 6, 8, 10, 12, 14, 16 };
int queries = 3;
int [,]q = { { 2, 4 },
{ 2, 6 },
{ 5, 6 } };
int n = arr.Length;
for ( int i = 0; i < queries; i++)
Console.Write(findSum(arr, n, q[i,0], q[i,1])
+ "\n" );
}
}
|
Javascript
<script>
function findSum(arr, n, left, right)
{
let k = right - left;
let d = arr[1] - arr[0];
let ans = arr[left - 1] * (k + 1);
ans = ans + (d * (k * (k + 1))) / 2;
return ans;
}
let arr = [ 2, 4, 6, 8, 10, 12, 14, 16 ];
let queries = 3;
let q = [[ 2, 4 ],
[ 2, 6 ],
[ 5, 6 ]];
let n = arr.length;
for (let i = 0; i < queries; i++)
document.write(findSum(arr, n, q[i][0], q[i][1])
+ "<br/>" );
</script>
|
Time complexity: O(q), where q is the length of the given queries array.
Auxiliary Space: O(1)
Method 2: Using Prefix Sum
Approach:
- Create a prefix sum array for the given arithmetic series.
- For each query, calculate the sum of the range by subtracting the prefix sum at L-1 from the prefix sum at R.
- Output the sum for each query.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > arithmetic_series_sum( int arr[], int N, vector<vector< int >> queries) {
int prefixSum[N];
prefixSum[0] = arr[0];
for ( int i = 1; i < N; i++) {
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
vector< int > ans;
for ( int i = 0; i < queries.size(); i++) {
int L = queries[i][0];
int R = queries[i][1];
int sum = prefixSum[R - 1] - prefixSum[L - 2];
ans.push_back(sum);
}
return ans;
}
int main() {
int arr[] = {2, 4, 6, 8, 10, 12, 14, 16};
int N = sizeof (arr) / sizeof (arr[0]);
vector<vector< int >> queries = {{2, 4},{2, 6},{5, 6}};
vector< int > ans = arithmetic_series_sum(arr, N, queries);
for ( int i = 0; i < ans.size(); i++) {
cout << ans[i] << endl;
}
return 0;
}
|
Java
import java.util.ArrayList;
public class GFG {
public static ArrayList<Integer> arithmeticSeriesSum(
int [] arr, int N,
ArrayList<ArrayList<Integer> > queries)
{
int [] prefixSum = new int [N];
prefixSum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < N; i++) {
prefixSum[i] = prefixSum[i - 1 ] + arr[i];
}
ArrayList<Integer> ans = new ArrayList<>();
for ( int i = 0 ; i < queries.size(); i++) {
int L = queries.get(i).get( 0 );
int R = queries.get(i).get( 1 );
int sum = prefixSum[R - 1 ]
- (L > 1 ? prefixSum[L - 2 ] : 0 );
ans.add(sum);
}
return ans;
}
public static void main(String[] args)
{
int [] arr = { 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 };
int N = arr.length;
ArrayList<ArrayList<Integer> > queries
= new ArrayList<>();
queries.add(
new ArrayList<>(java.util.Arrays.asList( 2 , 4 )));
queries.add(
new ArrayList<>(java.util.Arrays.asList( 2 , 6 )));
queries.add(
new ArrayList<>(java.util.Arrays.asList( 5 , 6 )));
ArrayList<Integer> ans
= arithmeticSeriesSum(arr, N, queries);
for ( int i = 0 ; i < ans.size(); i++) {
System.out.println(ans.get(i));
}
}
}
|
Python3
def arithmetic_series_sum(arr, N, queries):
prefixSum = [ 0 ] * N
prefixSum[ 0 ] = arr[ 0 ]
for i in range ( 1 , N):
prefixSum[i] = prefixSum[i - 1 ] + arr[i]
ans = []
for i in range ( len (queries)):
L = queries[i][ 0 ]
R = queries[i][ 1 ]
sum = prefixSum[R - 1 ] - prefixSum[L - 2 ]
ans.append( sum )
return ans
if __name__ = = "__main__" :
arr = [ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 ]
N = len (arr)
queries = [[ 2 , 4 ], [ 2 , 6 ], [ 5 , 6 ]]
ans = arithmetic_series_sum(arr, N, queries)
for i in range ( len (ans)):
print (ans[i])
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static List< int > ArithmeticSeriesSum( int [] arr, int N, List<List< int >> queries)
{
int [] prefixSum = new int [N];
prefixSum[0] = arr[0];
for ( int i = 1; i < N; i++)
{
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
List< int > ans = new List< int >();
for ( int i = 0; i < queries.Count; i++)
{
int L = queries[i][0];
int R = queries[i][1];
int sum = prefixSum[R - 1] - (L - 2 >= 0 ? prefixSum[L - 2] : 0);
ans.Add(sum);
}
return ans;
}
static void Main()
{
int [] arr = { 2, 4, 6, 8, 10, 12, 14, 16 };
int N = arr.Length;
List<List< int >> queries = new List<List< int >> {
new List< int > { 2, 4 },
new List< int > { 2, 6 },
new List< int > { 5, 6 }
};
List< int > ans = ArithmeticSeriesSum(arr, N, queries);
foreach ( int value in ans)
{
Console.WriteLine(value);
}
}
}
|
Javascript
function arithmeticSeriesSum(arr, N, queries) {
let prefixSum = [];
prefixSum[0] = arr[0];
for (let i = 1; i < N; i++) {
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
let ans = [];
for (let i = 0; i < queries.length; i++) {
let L = queries[i][0];
let R = queries[i][1];
let sum = prefixSum[R - 1] - (L > 1 ? prefixSum[L - 2] : 0);
ans.push(sum);
}
return ans;
}
let arr = [2, 4, 6, 8, 10, 12, 14, 16];
let N = arr.length;
let queries = [[2, 4], [2, 6], [5, 6]];
let ans = arithmeticSeriesSum(arr, N, queries);
for (let i = 0; i < ans.length; i++) {
console.log(ans[i]);
}
|
Time complexity: O(N + Q),N is the size of the arithmetic series and Q is the number of queries.
Auxiliary Space: O(N) for the prefix sum array.
Share your thoughts in the comments
Please Login to comment...