Number of prefix sum prime in given range query
Last Updated :
13 Oct, 2022
Given an array of non-negative integers and range query l, r, find number of prefix sum which are prime numbers in that given range.
Prerequisite : Prefix Sum | Primality Test
Examples :
Input : {2, 3, 4, 7, 9, 10},
l = 1, r = 5;
Output : 3
Explanation : prefixSum[0] = arr[l] = 3
prefixSum[1] = prefixSum[0] + arr[2] = 7,
prefixSum[2] = prefixSum[1] + arr[3] = 14,
prefixSum[3] = prefixSum[2] + arr[4] = 23,
prefixSum[4] = prefixSum[3] + arr[5] = 33,
There are three primes in prefix sum array in given
range. The primes are 3, 7 and 23.
Input : {5, 7, 8, 10, 13},
l = 0, r = 4;
Output : 2
prefixSum[0] = arr[l] = 5,
prefixSum[1] = prefixSum[0] + arr[1] = 12,
prefixSum[2] = prefixSum[1] + arr[2] = 20,
prefixSum[3] = prefixSum[2] + arr[3] = 30,
prefixSum[4] = prefixSum[3] + arr[4] = 43,
There are two primes in prefix sum array in given
range. The primes are 5 and 43
Approach : Run a loop through l to r, where l and r are the range of indices and fill the prefix sum array which will be of size same as that of array, by adding the previous element of the prefix sum array and present element of the array, then, check whether the prefix sum at each stage is prime or not through Primality Test of checking primes. If the prefix sum is prime then increase the count otherwise not.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
bool isPrime( int num)
{
if (num <= 1) return false ;
if (num <= 3) return true ;
if (num%2 == 0 || num%3 == 0)
return false ;
for ( int j = 5; j * j <= num; j = j + 6)
if (num%j == 0 || num%(j+2) == 0)
return false ;
return true ;
}
int primesubArraySum( int arr[], int n, int l,
int r, int preSum[])
{
int count = 0;
preSum[0] = arr[l];
if (isPrime(preSum[0]))
count++;
for ( int i = l + 1, j = 1;
i <= r && j < n; i++,j++)
{
preSum[j] = preSum[j - 1] + arr[i];
if (isPrime(preSum[j]))
count++;
}
return count;
}
int main()
{
int arr[] = {5, 7, 8, 10, 13};
int n = sizeof (arr)/ sizeof (arr[0]);
int preSum[n];
int l = 0, r = 4;
cout << primesubArraySum(arr, n, l, r, preSum);
return 0;
}
|
Java
import java.util.*;
class GFG
{
public static boolean isPrime( int num)
{
if (num <= 1 )
return false ;
if (num <= 3 )
return true ;
if (num % 2 == 0 || num % 3 == 0 )
return false ;
for ( int j = 5 ; j * j <= num; j = j + 6 )
if (num % j == 0 || num % (j + 2 ) == 0 )
return false ;
return true ;
}
public static int primesubArraySum( int arr[], int n,
int l, int r,
int preSum[])
{
int count = 0 ;
preSum[ 0 ] = arr[l];
if (isPrime(preSum[ 0 ]) == true )
count++;
for ( int i = l+ 1 ,j = 1 ; i <= r && j < n; i++,j++)
{
preSum[j] = preSum[j- 1 ] + arr[i];
if (isPrime(preSum[j]) == true )
count++;
}
return count;
}
public static void main (String[] args)
{
int arr[] = { 5 , 7 , 8 , 10 , 13 };
int n = arr.length;
int preSum[] = new int [n];
int l = 0 , r = 4 ;
System.out.println(primesubArraySum(arr, n,
l, r, preSum));
}
}
|
Python3
import numpy
import math
def isPrime(num):
if (num < = 1 ):
return False ;
if (num < = 3 ):
return True ;
if (num % 2 = = 0 or num % 3 = = 0 ):
return False ;
for j in range ( 5 , ( int )(math.sqrt(num)) + 1 , 6 ):
if (num % j = = 0 or num % (j + 2 ) = = 0 ):
return False ;
return True ;
def primesubArraySum(arr, n, l, r, preSum):
count = 0 ;
preSum[ 0 ] = arr[l];
if (isPrime(preSum[ 0 ])):
count = count + 1 ;
for i in range (l + 1 , r):
for j in range ( 1 , n):
preSum[j] = preSum[j - 1 ] + arr[i];
if (isPrime(preSum[j])):
count = count + 1 ;
return count;
arr = [ 5 , 7 , 8 , 10 , 13 ];
n = len (arr);
preSum = numpy.arange(n);
l = 0 ;
r = 4 ;
print (primesubArraySum(arr, n, l, r, preSum));
|
C#
using System;
class GFG {
public static bool isPrime( int num)
{
if (num <= 1)
return false ;
if (num <= 3)
return true ;
if (num % 2 == 0 || num % 3 == 0)
return false ;
for ( int j = 5; j * j <= num; j = j + 6)
if (num % j == 0 || num % (j + 2) == 0)
return false ;
return true ;
}
public static int primesubArraySum( int []arr, int n,
int l, int r,
int []preSum)
{
int count = 0;
preSum[0] = arr[l];
if (isPrime(preSum[0]) == true )
count++;
for ( int i = l+1,j = 1; i <= r &&
j < n; i++,j++)
{
preSum[j] = preSum[j-1] + arr[i];
if (isPrime(preSum[j]) == true )
count++;
}
return count;
}
public static void Main ()
{
int []arr = {5, 7, 8, 10, 13};
int n = arr.Length;
int []preSum = new int [n];
int l = 0, r = 4;
Console.Write(primesubArraySum(arr, n,
l, r, preSum));
}
}
|
PHP
<?php
function isPrime( $num )
{
if ( $num <= 1) return false;
if ( $num <= 3) return true;
if ( $num % 2 == 0 ||
$num % 3 == 0)
return false;
for ( $j = 5; $j * $j <= $num ;
$j = $j + 6)
if ( $num % $j == 0 ||
$num % ( $j + 2) == 0)
return false;
return true;
}
function primesubArraySum( $arr , $n ,
$l , $r , $preSum )
{
$count = 0;
$preSum [0] = $arr [ $l ];
if (isPrime( $preSum [0]))
$count ++;
for ( $i = $l + 1, $j = 1;
$i <= $r && $j < $n ;
$i ++, $j ++)
{
$preSum [ $j ] = $preSum [ $j - 1] +
$arr [ $i ];
if (isPrime( $preSum [ $j ]))
$count ++;
}
return $count ;
}
$arr = array (5, 7, 8, 10, 13);
$n = sizeof( $arr );
$preSum = array ();
$l = 0; $r = 4;
echo primesubArraySum( $arr , $n , $l ,
$r , $preSum );
?>
|
Javascript
<script>
function isPrime(num)
{
if (num <= 1)
return false ;
if (num <= 3)
return true ;
if (num % 2 == 0 || num % 3 == 0)
return false ;
for (let j = 5; j * j <= num; j = j + 6)
if (num % j == 0 || num % (j + 2) == 0)
return false ;
return true ;
}
function primesubArraySum(arr, n, l, r, preSum)
{
let count = 0;
preSum[0] = arr[l];
if (isPrime(preSum[0]) == true )
count++;
for (let i = l + 1, j = 1;
i <= r && j < n;
i++, j++)
{
preSum[j] = preSum[j - 1] + arr[i];
if (isPrime(preSum[j]) == true )
count++;
}
return count;
}
let arr = [ 5, 7, 8, 10, 13 ];
let n = arr.length;
let preSum = new Array(n);
preSum.fill(0);
let l = 0, r = 4;
document.write(primesubArraySum(
arr, n, l, r, preSum));
</script>
|
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...