Find the Number of Prefix Sum Prime in Given Range Query using C++


In this article, we need to find a number of prefix sum which are prime numbers in a given array arr[ ] of positive integers and range query L, R, where L is the initial index value arr[ L ] for prefixsum[ ] array and R is the number of prefix sum we need to find.

To fill the prefix sum array, we start with index L to index R and add the present value with the last element in the given array. So here is the Example for the problem −

Input : arr[ ] = { 3, 5, 6, 2, 4 }
L = 1, R = 3
Output : 3
Explanation : prefixsum[ 0 ] = arr[ L ] = 5
prefixsum[ 1 ] = prefixsum[ 0 ] + arr[ 2 ] = 11
prefixsum[ 2 ] = prefixsum[ 1 ] + arr[ 3 ] = 13
In prefixsum[ ] array all three 5, 11 and 13 are prime numbers in prefix sum array in given range.

Input : arr[ ] = { 6, 10, 5, 8, 11 }
L = 0, R = 3
Output : 1
Explanation : prefixsum[ 0 ] = arr[ L ] = 6
prefixsum[ 1 ] = prefixsum[ 0 ] + arr[ 1 ] = 16
prefixsum[ 2 ] = prefixsum[ 1 ] + arr[ 2 ] = 21
prefixsum[ 3 ] = prefixsum[ 2 ] + arr[ 3 ] = 29
In prefixsum[ ] array only 29 is the prime number in prefix sum array given range.

Approach to Find the Solution

Looking at the problem, we can say that we need to create one new array prefixsum[ ] and fill that array by adding the previous element of the prefix sum array and the current element of the given array. The first element of the prefix sum array will be the value at index L in the given array.

We need to run a loop from L to R where L and R are a range of indices to process in the given array, then check the element of prefixsum[ ] array and increment the count for every prime number found.

Example

#include<bits/stdc++.h>
using namespace std;
vector < bool > checkprime (int *arr, int n, int MAX){
    vector < bool > p (n);
    bool Prime_val[MAX + 1];
    for (int i = 2; i < MAX; i++)
        Prime_val[i] = true;
        Prime_val[1] = false;
    for (int p = 2; p * p <= MAX; p++){
        // If prime[p] is not changed, then
        // it is a prime
        if (Prime_val[p] == true){
            // Update all multiples of p
            for (int i = p * 2; i <= MAX; i += p)
                Prime_val[i] = false;
        }
    }
    for (int i = 0; i < n; i++){
        if (Prime_val[arr[i]])
             p[i] = true;
        else
        p[i] = false;
    }
    return p;
}
int main (){
    int arr[] = { 2, 3, 4, 7, 9, 10 };
    int s1 = sizeof (arr) / sizeof (arr[0]);//size of given array
    int L = 1, R = 3, s2 = R - L + 1;
    int prefixsum[s2];
    int count = 0;
    prefixsum[0] = arr[L];
    for (int i = L + 1, j = 1; i <= R && j < s1; i++, j++){
        prefixsum[j] = prefixsum[j - 1] + arr[i];

    }
    vector < bool > isprime = checkprime (prefixsum, s2, prefixsum[s2 - 1]);
    for (int i = 0; i < s2; i++) {
        if (isprime[i] == 1)
            count++;
    }
    cout <<"Number of prefix sum prime in given range query: " << count;
    return 0;
}

Output

Number of prefix sum prime in given range query: 2

Explanation of the Above Code

In this code, we are making an array prefixsum[ ] and filling it with the sum of the previous element of prefixsum[ ] array and the current element of the given array. After that, we are checking all the numbers of prefix arrays for prime numbers, and here we are using the Sieve of Eratosthenes algorithm to check for prime numbers. Finally, incrementing the count for each prime number and showing the result.

Conclusion

In this article, we solved finding a number of prefix sum prime in a given range query by applying a naive approach and using Sieve of Eratosthenes to find prime numbers in the prefix sum array. We can write the same program in other languages such as C, java, python, and other languages. Hope you find this article helpful.

Updated on: 24-Nov-2021

181 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements