Skip to content
Related Articles

Related Articles

Count of Double Prime numbers in a given range L to R
  • Last Updated : 19 Aug, 2020

Given two integers L and R, the task to find the number of Double Prime numbers in the range.

A number N is called double prime when the count of prime numbers in the range 1 to N (excluding 1 and including N) is also prime.

Examples:

Input: L = 3, R = 10
Output: 4
Explanation:
For 3, we have the range 1, 2, 3, and count of prime number is 2 (which is also a prime no.)
For 4, we have the range 1, 2, 3, 4, and count of a prime number is 2 (which is also a prime no.)
For 5, we have the range 1, 2, 3, 4, 5, and count of a prime number is 3 (which is also a prime no.)
For 6, we have the range 1, 2, 3, 4, 5, 6, and count of prime numbers is 3 (which is also a prime no.)
For 7, we have the range 1, 2, 3, 4, 5, 6, 7, and count of prime numbers is 4 which is nonprime.
Similarly for other numbers till R = 10, the count of prime numbers is nonprime. Hence the count of double prime numbers is 4.

Input: L = 4, R = 12
Output: 5
Explanation:
For the given range there are total 5 double prime numbers.



Approach:

To solve the problem mentioned above we will use the concept of Sieve to generate prime numbers.

  • Generate all prime numbers for 0 to 106 and store in an array.
  • Initialize a variable count to keep a track of prime numbers from 1 to some ith position.
  • Then for every prime number we will increment the count and also set dp[count] = 1 (where dp is the array which stores a double prime number) indicating the number of numbers from 1 to some ith position that are prime.
  • Lastly, find the cumulative sum of dp array so the answer will be dp[R] – dp[L – 1].

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the count
// of Double Prime numbers
// in the range L to R
  
#include <bits/stdc++.h>
using namespace std;
  
// Array to make Sieve
// where arr[i]=0 indicates
// non prime and arr[i] = 1
// indicates prime
int arr[1000001];
  
// Array to find double prime
int dp[1000001];
  
// Function to find the number
// double prime numbers in range
void count()
{
    int maxN = 1000000, i, j;
  
    // Assume all numbers as prime
    for (i = 0; i < maxN; i++)
        arr[i] = 1;
  
    arr[0] = 0;
    arr[1] = 0;
  
    for (i = 2; i * i <= maxN; i++) {
  
        // Check if the number is prime
        if (arr[i] == 1) {
  
            // check for multiples of i
            for (j = 2 * i; j <= maxN; j += i) {
  
                // Make all multiples of
                // ith prime as non-prime
                arr[j] = 0;
            }
        }
    }
  
    int cnt = 0;
  
    for (i = 0; i <= maxN; i++) {
        // Check if number at ith position
        // is prime then increment count
        if (arr[i] == 1)
            cnt++;
  
        if (arr[cnt] == 1)
  
            // Indicates count of numbers
            // from 1 to i that are
            // also prime and
            // hence double prime
            dp[i] = 1;
  
        else
            // If number is not a double prime
            dp[i] = 0;
    }
    for (i = 1; i <= maxN; i++)
        // finding cumulative sum
        dp[i] += dp[i - 1];
}
  
// Driver code
int main()
{
    int L = 4, R = 12;
    count();
    cout << dp[R] - dp[L - 1];
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the count
// of Double Prime numbers
// in the range L to R
import java.util.*;
import java.lang.*;
class GFG{
      
// Array to make Sieve
// where arr[i]=0 indicates
// non prime and arr[i] = 1
// indicates prime
static int[] arr = new int[1000001];
  
// Array to find double prime
static int[] dp = new int[1000001];
  
// Function to find the number
// double prime numbers in range
static void count()
{
    int maxN = 1000000, i, j;
  
    // Assume all numbers as prime
    for (i = 0; i < maxN; i++)
        arr[i] = 1;
  
    arr[0] = 0;
    arr[1] = 0;
  
    for (i = 2; i * i <= maxN; i++) 
    {
  
        // Check if the number is prime
        if (arr[i] == 1
        {
  
            // check for multiples of i
            for (j = 2 * i; j <= maxN; j += i) 
            {
  
                // Make all multiples of
                // ith prime as non-prime
                arr[j] = 0;
            }
        }
    }
  
    int cnt = 0;
  
    for (i = 0; i <= maxN; i++) 
    {
        // Check if number at ith position
        // is prime then increment count
        if (arr[i] == 1)
            cnt++;
  
        if (arr[cnt] == 1)
  
            // Indicates count of numbers
            // from 1 to i that are
            // also prime and
            // hence double prime
            dp[i] = 1;
  
        else
            // If number is not a double prime
            dp[i] = 0;
    }
      
    for (i = 1; i <= maxN; i++)
      
        // finding cumulative sum
        dp[i] += dp[i - 1];
}
  
// Driver code
public static void main(String[] args)
{
    int L = 4, R = 12;
    count();
    System.out.println(dp[R] - dp[L - 1]);
}
}
  
// This code is contributed by offbeat

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

chevron_right


Output:

5

competitive-programming-img

My Personal Notes arrow_drop_up
Recommended Articles
Page :