Count of all values of N in [L, R] such that count of primes upto N is also prime - GeeksforGeeks

12 May, 2021
Given two positive integers L and R, the task is to find out the total number of values between range [L, R] such that the count of prime numbers from 1 to N is also prime.Examples: 
Input: L = 3, R = 10 Output: 4 Explanation: Number of primes upto 3, 4, 5, 6, 7, 8, 9 and 10 are 2, 2, 3, 3, 4, 4, 4 and 4 respectively. So, there are a total 4 such numbers {3, 4, 5, 6}[3, 10].Input: L = 4, R = 12 Output: 5 Explanation: Number of primes upto 4, 5, 6, 7, 8, 9, 10, 11 and 12 are 2, 3, 3, 4, 4, 4, 4, 5 and 5 respectively. So, there are total 5 such numbers {4, 5, 6, 11, 12} which satisfy the condition in the range [4, 12].  
Naive Approach: The simplest approach to solve the problem is to traverse for all values in the range [1, L – 1] count the number of primes in that range. Once, calculated, check if the count is prime or not. Now, start traversing the values in the range [L, R] one by one and check if the number is prime or not and increase the count accordingly. For every updated count check if it is prime or not and accordingly update the count of required numbers from the given range. Time Complexity: O(R2)Efficient Approach: The above approach can be further optimized by the Sieve of Eratosthenes. Follow the steps below to solve the problem:  
Find all prime numbers up to R using a sieve.Maintain a frequency array to store the count of primes up to for all values up to R.Create another count array(say freqPrime[]) and add 1 at position i if the cumulative count of total primes up to i is itself a prime number.Now for any range L to R, then the number of crazy primes can be calculated by freqPrime[R] – freqPrime[L – 1].
Find all prime numbers up to R using a sieve.
Maintain a frequency array to store the count of primes up to for all values up to R.
Create another count array(say freqPrime[]) and add 1 at position i if the cumulative count of total primes up to i is itself a prime number.
Now for any range L to R, then the number of crazy primes can be calculated by freqPrime[R] – freqPrime[L – 1].
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to count the number of// crazy primes in the given range [L, R]int count_crazy_primes(int L, int R){    // Stores all primes    int prime[R + 1] = { 0 };     // Stores count of primes    int countPrime[R + 1] = { 0 };     // Stores if frequency of    // primes is a prime or not    // upto each index    int freqPrime[R + 1] = { 0 };     prime[0] = prime[1] = 1;    // Sieve of Eratosthenes    for (int p = 2; p * p <= R; p++) {        if (prime[p] == 0) {            for (int i = p * p;                 i <= R; i += p)                 prime[i] = 1;        }    }     // Count primes    for (int i = 1; i <= R; i++) {        countPrime[i] = countPrime[i - 1];         // If i is a prime        if (!prime[i]) {            countPrime[i]++;        }    }     // Stores frequency of primes    for (int i = 1; i <= R; i++) {        freqPrime[i] = freqPrime[i - 1];         // If the frequency of primes        // is a prime        if (!prime[countPrime[i]]) {             // Increase count of            // required numbers            freqPrime[i]++;        }    }     // Return the required count    return (freqPrime[R]            - freqPrime[L - 1]);} // Driver Codeint main(){    // Given Range    int L = 4, R = 12;     // Function Call    cout << count_crazy_primes(L, R);    return 0;}
// Java implementation of the approachclass GFG{ // Function to count the number of// crazy primes in the given range [L, R]static int count_crazy_primes(int L, int R){         // Stores all primes    int prime[] = new int[R + 1];     // Stores count of primes    int countPrime[] = new int[R + 1];     // Stores if frequency of    // primes is a prime or not    // upto each index    int freqPrime[] = new int[R + 1];         prime[0] = 1;    prime[1] = 1;         // Sieve of Eratosthenes    for(int p = 2; p * p <= R; p++)    {       if (prime[p] == 0)       {           for(int i = p * p;                   i <= R; i += p)              prime[i] = 1;       }    }     // Count primes    for(int i = 1; i <= R; i++)    {       countPrime[i] = countPrime[i - 1];               // If i is a prime       if (prime[i] != 0)       {           countPrime[i]++;       }    }     // Stores frequency of primes    for(int i = 1; i <= R; i++)    {       freqPrime[i] = freqPrime[i - 1];               // If the frequency of primes       // is a prime       if (prime[countPrime[i]] != 0)       {                       // Increase count of           // required numbers           freqPrime[i]++;       }    }     // Return the required count    return (freqPrime[R] -            freqPrime[L - 1]);} // Driver codepublic static void main (String[] args){         // Given range    int L = 4, R = 12;     // Function call    System.out.println(count_crazy_primes(L, R));}} // This code is contributed by Pratima Pandey    
# Python3 program for the above approach # Function to count the number of# crazy primes in the given range [L, R]def count_crazy_primes(L, R):     # Stores all primes    prime = [0] * (R + 1)     # Stores count of primes    countPrime = [0] * (R + 1)     # Stores if frequency of    # primes is a prime or not    # upto each index    freqPrime = [0] * (R + 1)     prime[0] = prime[1] = 1         # Sieve of Eratosthenes    p = 2    while p * p <= R:        if (prime[p] == 0):            for i in range (p * p,                            R + 1 , p):                prime[i] = 1        p += 1        # Count primes    for i in range (1 , R + 1):        countPrime[i] = countPrime[i - 1]         # If i is a prime        if (not prime[i]):            countPrime[i] += 1     # Stores frequency of primes    for i in range (1, R + 1):        freqPrime[i] = freqPrime[i - 1]         # If the frequency of primes        # is a prime        if (not prime[countPrime[i]]):             # Increase count of            # required numbers            freqPrime[i] += 1     # Return the required count    return (freqPrime[R] -            freqPrime[L - 1]) # Driver Codeif __name__ =="__main__":       # Given Range    L = 4    R = 12     # Function Call    print(count_crazy_primes(L, R)) # This code is contributed by Chitranayal
// C# implementation of the approachusing System;class GFG{   // Function to count the number of// crazy primes in the given range [L, R]static int count_crazy_primes(int L,                              int R){         // Stores all primes    int []prime = new int[R + 1];       // Stores count of primes    int []countPrime = new int[R + 1];       // Stores if frequency of    // primes is a prime or not    // upto each index    int []freqPrime = new int[R + 1];           prime[0] = 1;    prime[1] = 1;           // Sieve of Eratosthenes    for(int p = 2; p * p <= R; p++)    {       if (prime[p] == 0)       {           for(int i = p * p; i <= R;               i += p)              prime[i] = 1;       }    }       // Count primes    for(int i = 1; i <= R; i++)    {       countPrime[i] = countPrime[i - 1];                 // If i is a prime       if (prime[i] != 0)       {           countPrime[i]++;       }    }       // Stores frequency of primes    for(int i = 1; i <= R; i++)    {       freqPrime[i] = freqPrime[i - 1];                 // If the frequency of primes       // is a prime       if (prime[countPrime[i]] != 0)       {                       // Increase count of           // required numbers           freqPrime[i]++;       }    }       // Return the required count    return (freqPrime[R] -            freqPrime[L - 1]);}   // Driver codepublic static void Main(String[] args){          // Given range    int L = 4, R = 12;       // Function call    Console.WriteLine(            count_crazy_primes(L, R));}}// This code is contributed by 29AjayKumar
<script>// Javascript program for the above approach // Function to count the number of// crazy primes in the given range [L, R]function count_crazy_primes(L, R){         // Stores all primes    let prime = Array.from({length: R+1}, (_, i) => 0);     // Stores count of primes    let countPrime = Array.from({length: R+1}, (_, i) => -1);     // Stores if frequency of    // primes is a prime or not    // upto each index    let freqPrime = Array.from({length: R+1}, (_, i) => 0);         prime[0] = 1;    prime[1] = 1;         // Sieve of Eratosthenes    for(let p = 2; p * p <= R; p++)    {       if (prime[p] == 0)       {           for(let i = p * p;                   i <= R; i += p)              prime[i] = 1;       }    }     // Count primes    for(let i = 1; i <= R; i++)    {       countPrime[i] = countPrime[i - 1];               // If i is a prime       if (prime[i] != 0)       {           countPrime[i]++;       }    }    // Stores frequency of primes    for (let i = 1; i <= R; i++) {        freqPrime[i] = freqPrime[i - 1];         // If the frequency of primes        // is a prime        if (!prime[countPrime[i]]) {             // Increase count of            // required numbers            freqPrime[i]++;        }    }      // Return the required count    return (freqPrime[R] -            freqPrime[L - 1]);}     // Driver Code         // Given range    let L = 4, R = 12;     // Function call    document.write(count_crazy_primes(L, R)); </script>
5
 
Time Complexity: O(R*log(log(R))) Auxillary Space: O(R)
dewantipandeydp
29AjayKumar
ukasp
susmitakundugoaldanga
array-range-queries
prefix
Prime Number
Arrays
Competitive Programming
Mathematical
Arrays
Mathematical
Prime Number
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Window Sliding Technique
Trapping Rain Water
Reversal algorithm for array rotation
Building Heap from Array
Program to find sum of elements in a given array
Competitive Programming - A Complete Guide
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Bits manipulation (Important tactics)
Top 10 Algorithms and Data Structures for Competitive Programming