Find the summation of the product of Array elements in range [L, R]
Last Updated :
22 Jun, 2022
Given an array arr[] and two integers L and R. The task is to find the sum of the product of all the pairs (i, j) in the range [L, R], such that i ≤ j.
Input: arr[] = { 1, 3, 5, 8 }, L = 0, R = 2
Output: 58
Explanation: As 1*1 + 1*3 + 1*5 + 3*3 + 3*5 + 5*5 = 58
Input: arr[] = { 2, 1, 4, 5, 3, 2, 1 }, L = 1, R = 5
Output: 140
Naive Approach: The brute force approach can be directly implemented by multiplying the indices using two nested loops and storing the sum in a variable.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int sum_of_products( int arr[], int N, int L,
int R)
{
int sum = 0;
for ( int i = L; i <= R; i++) {
for ( int j = i; j <= R; j++) {
sum += arr[i] * arr[j];
}
}
return sum;
}
int main()
{
int arr[] = { 1, 3, 5, 8 };
int N = sizeof (arr) / sizeof (arr[0]);
int L = 0;
int R = 2;
cout << sum_of_products(arr, N, L, R);
return 0;
}
|
Java
import java.util.*;
public class GFG {
static int sum_of_products( int [] arr, int N, int L,
int R)
{
int sum = 0 ;
for ( int i = L; i <= R; i++) {
for ( int j = i; j <= R; j++) {
sum += arr[i] * arr[j];
}
}
return sum;
}
public static void main(String args[])
{
int [] arr = { 1 , 3 , 5 , 8 };
int N = arr.length;
int L = 0 ;
int R = 2 ;
System.out.println(sum_of_products(arr, N, L, R));
}
}
|
Python3
def sum_of_products(arr, N, L, R):
sum1 = 0
for i in range (L, R + 1 ):
for j in range (i, R + 1 ):
sum1 + = arr[i] * arr[j]
return sum1
if __name__ = = "__main__" :
arr = [ 1 , 3 , 5 , 8 ]
N = len (arr)
L = 0
R = 2
print (sum_of_products(arr, N, L, R))
|
C#
using System;
class GFG {
static int sum_of_products( int [] arr, int N, int L,
int R)
{
int sum = 0;
for ( int i = L; i <= R; i++) {
for ( int j = i; j <= R; j++) {
sum += arr[i] * arr[j];
}
}
return sum;
}
public static void Main()
{
int [] arr = { 1, 3, 5, 8 };
int N = arr.Length;
int L = 0;
int R = 2;
Console.WriteLine(sum_of_products(arr, N, L, R));
}
}
|
Javascript
<script>
function sum_of_products(arr, N, L, R) {
let sum = 0;
for (let i = L; i <= R; i++) {
for (let j = i; j <= R; j++) {
sum += arr[i] * arr[j];
}
}
return sum;
}
let arr = [1, 3, 5, 8];
let N = arr.length
let L = 0;
let R = 2;
document.write(sum_of_products(arr, N, L, R));
</script>
|
Time complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: This problem can be efficiently solved by using the Prefix sum technique. In this method, store the prefix sum in pre-calculation and then iterate a single loop from L to R and multiply the corresponding prefix sum from that index to the last index.
Basically 1*1+1*3+1*5+3*3+3*5+5*5 can be written as 1*(1+3+5)+3*(3+5)+5*(5) = 1*(prefix_sum from 1 to 5)+3*(prefix_sum from 3 to 5)+5*(prefix sum from 5 to 5)
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int sum_of_products( int arr[], int n, int L,
int R)
{
int sum = 0;
int prefix_sum[n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++) {
prefix_sum[i] = prefix_sum[i - 1]
+ arr[i];
}
for ( int i = L; i <= R; i++) {
if (i != 0)
sum += arr[i]
* (prefix_sum[R]
- prefix_sum[i - 1]);
else
sum += arr[i] * (prefix_sum[R]);
}
return sum;
}
int main()
{
int arr[] = { 1, 3, 5, 8 };
int N = sizeof (arr) / sizeof (arr[0]);
int L = 0;
int R = 2;
cout << sum_of_products(arr, N, L, R);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int sum_of_products( int arr[], int n, int L,
int R)
{
int sum = 0 ;
int []prefix_sum = new int [n];
prefix_sum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++) {
prefix_sum[i] = prefix_sum[i - 1 ]
+ arr[i];
}
for ( int i = L; i <= R; i++) {
if (i != 0 )
sum += arr[i]
* (prefix_sum[R]
- prefix_sum[i - 1 ]);
else
sum += arr[i] * (prefix_sum[R]);
}
return sum;
}
public static void main(String[] args)
{
int arr[] = { 1 , 3 , 5 , 8 };
int N = arr.length;
int L = 0 ;
int R = 2 ;
System.out.print(sum_of_products(arr, N, L, R));
}
}
|
Python3
def sum_of_products(arr, n, L, R):
sum = 0
prefix_sum = [ 0 ] * n;
prefix_sum[ 0 ] = arr[ 0 ];
for i in range ( 1 , n):
prefix_sum[i] = prefix_sum[i - 1 ] + arr[i]
for i in range (L, R + 1 ):
if (i ! = 0 ):
sum + = arr[i] * (prefix_sum[R] - prefix_sum[i - 1 ])
else :
sum + = arr[i] * (prefix_sum[R])
return sum
if __name__ = = '__main__' :
arr = [ 1 , 3 , 5 , 8 ]
N = len (arr)
L = 0
R = 2
print (sum_of_products(arr, N, L, R))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int sum_of_products( int [] arr, int n, int L,
int R)
{
int sum = 0;
int []prefix_sum = new int [n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++) {
prefix_sum[i] = prefix_sum[i - 1]
+ arr[i];
}
for ( int i = L; i <= R; i++) {
if (i != 0)
sum += arr[i]
* (prefix_sum[R]
- prefix_sum[i - 1]);
else
sum += arr[i] * (prefix_sum[R]);
}
return sum;
}
public static void Main()
{
int [] arr = { 1, 3, 5, 8 };
int N = arr.Length;
int L = 0;
int R = 2;
Console.Write(sum_of_products(arr, N, L, R));
}
}
|
Javascript
<script>
function sum_of_products(arr , n , L , R) {
var sum = 0;
var prefix_sum = Array(n).fill(0);
prefix_sum[0] = arr[0];
for (i = 1; i < n; i++) {
prefix_sum[i] = prefix_sum[i - 1] + arr[i];
}
for (i = L; i <= R; i++) {
if (i != 0)
sum += arr[i] * (prefix_sum[R] - prefix_sum[i - 1]);
else
sum += arr[i] * (prefix_sum[R]);
}
return sum;
}
var arr = [ 1, 3, 5, 8 ];
var N = arr.length;
var L = 0;
var R = 2;
document.write(sum_of_products(arr, N, L, R));
</script>
|
Time complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...