Skip to content
Related Articles

Related Articles

Improve Article

Special prime numbers

  • Difficulty Level : Medium
  • Last Updated : 01 Apr, 2021

Given two numbers n and k, find whether there exist at least k Special prime numbers or not from 2 to n inclusively. 
A prime number is said to be Special prime number if it can be expressed as the sum of three integer numbers: two neighboring prime numbers and 1. For example, 19 = 7 + 11 + 1, or 13 = 5 + 7 + 1. 
Note:- Two prime numbers are called neighboring if there are no other prime numbers between them. 
Examples: 
 

Input : n = 27, k = 2
Output : YES
In this sample the answer is YES 
since at least two numbers are 
Special 13(5 + 7 + 1) and
19(7 + 11 + 1).

Input : n = 45, k = 7
Output : NO
In this example, the Special 
prime numbers are 13(5 + 7 + 1), 
19(7 + 11 + 1), 31(13 + 17 + 1),
37(17 + 19 + 1), 43(19 + 23 + 1).
As the no. of Special prime 
numbers from 2 to 45 is less than
k, the output is NO.

 

To solve this problem we need to find prime numbers in range [2..n]. So we us Sieve of Eratosthenes to generate all the prime numbers from 2 to n. Then, Take every pair of neighboring prime numbers and check if their sum increased by 1 is a prime number too. Count the number of these pairs, compare it to K and output the result. 
Below is the implementation of the above approach:- 
 

C++




// CPP program to check whether there
// exist at least k or not in range [2..n]
#include <bits/stdc++.h>
using namespace std;
 
vector<int> primes;
 
// Generating all the prime numbers
// from 2 to n.
void SieveofEratosthenes(int n)
{
    bool visited[n];
    for (int i = 2; i <= n + 1; i++)
        if (!visited[i]) {
            for (int j = i * i; j <= n + 1; j += i)
                visited[j] = true;
            primes.push_back(i);
        }
}
 
bool specialPrimeNumbers(int n, int k)
{
    SieveofEratosthenes(n);
    int count = 0;
    for (int i = 0; i < primes.size(); i++) {
        for (int j = 0; j < i - 1; j++) {
 
            // If a prime number is Special prime
            // number, then we increments the
            // value of k.
            if (primes[j] + primes[j + 1] + 1
                == primes[i]) {
                count++;
                break;
            }
        }
 
        // If at least k Special prime numbers
        // are present, then we return 1.
        // else we return 0 from outside of
        // the outer loop.
        if (count == k)
            return true;
    }
    return false;
}
 
// Driver function
int main()
{
    int n = 27, k = 2;
    if (specialPrimeNumbers(n, k))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}

Java




// Java program to check whether there
// exist at least k or not in range [2..n]
import java.util.*;
class GFG{
static ArrayList<Integer> primes = new ArrayList<Integer>();
// Generating all the prime numbers
// from 2 to n.
static void SieveofEratosthenes(int n)
{
    boolean[] visited=new boolean[n*n+2];
    for (int i = 2; i <= n + 1; i++)
        if (!visited[i]) {
            for (int j = i * i; j <= n + 1; j += i)
                visited[j] = true;
            primes.add(i);
        }
}
 
static boolean specialPrimeNumbers(int n, int k)
{
    SieveofEratosthenes(n);
    int count = 0;
    for (int i = 0; i < primes.size(); i++) {
        for (int j = 0; j < i - 1; j++) {
 
            // If a prime number is Special prime
            // number, then we increments the
            // value of k.
            if (primes.get(j) + primes.get(j + 1) + 1
                == primes.get(i)) {
                count++;
                break;
            }
        }
 
        // If at least k Special prime numbers
        // are present, then we return 1.
        // else we return 0 from outside of
        // the outer loop.
        if (count == k)
            return true;
    }
    return false;
}
 
// Driver function
public static void main(String[] args)
{
    int n = 27, k = 2;
    if (specialPrimeNumbers(n, k))
        System.out.println("YES");
    else
        System.out.println("NO");
}
}
// This code is contributed by mits

Python3




# Python3 program to check whether there
# exist at least k or not in range [2..n]
primes = [];
 
# Generating all the prime numbers
# from 2 to n.
def SieveofEratosthenes(n):
 
    visited = [False] * (n + 2);
    for i in range(2, n + 2):
        if (visited[i] == False):
            for j in range(i * i, n + 2, i):
                visited[j] = True;
            primes.append(i);
 
def specialPrimeNumbers(n, k):
 
    SieveofEratosthenes(n);
    count = 0;
    for i in range(len(primes)):
        for j in range(i - 1):
 
            # If a prime number is Special
            # prime number, then we increments
            # the value of k.
            if (primes[j] +
                primes[j + 1] + 1 == primes[i]):
                count += 1;
                break;
 
        # If at least k Special prime numbers
        # are present, then we return 1.
        # else we return 0 from outside of
        # the outer loop.
        if (count == k):
            return True;
 
    return False;
 
# Driver Code
n = 27;
k = 2;
if (specialPrimeNumbers(n, k)):
    print("YES");
else:
    print("NO");
 
# This code is contributed by mits

C#




// C# program to check whether there
// exist at least k or not in range [2..n]
using System;
using System.Collections;
 
class GFG{
static ArrayList primes = new ArrayList();
// Generating all the prime numbers
// from 2 to n.
static void SieveofEratosthenes(int n)
{
    bool[] visited=new bool[n*n+2];
    for (int i = 2; i <= n + 1; i++)
        if (!visited[i]) {
            for (int j = i * i; j <= n + 1; j += i)
                visited[j] = true;
            primes.Add(i);
        }
}
 
static bool specialPrimeNumbers(int n, int k)
{
    SieveofEratosthenes(n);
    int count = 0;
    for (int i = 0; i < primes.Count; i++) {
        for (int j = 0; j < i - 1; j++) {
 
            // If a prime number is Special prime
            // number, then we increments the
            // value of k.
            if ((int)primes[j] + (int)primes[j + 1] + 1
                == (int)primes[i]) {
                count++;
                break;
            }
        }
 
        // If at least k Special prime numbers
        // are present, then we return 1.
        // else we return 0 from outside of
        // the outer loop.
        if (count == k)
            return true;
    }
    return false;
}
 
// Driver function
public static void Main()
{
    int n = 27, k = 2;
    if (specialPrimeNumbers(n, k))
        Console.WriteLine("YES");
    else
        Console.WriteLine("NO");
}
}
// This code is contributed by mits

PHP




<?php
// PHP program to check whether there
// exist at least k or not in range [2..n]
$primes = array();
 
// Generating all the prime numbers
// from 2 to n.
function SieveofEratosthenes($n)
{
    global $primes;
    $visited = array_fill(0, $n, false);
    for ($i = 2; $i <= $n + 1; $i++)
        if (!$visited[$i])
        {
            for ($j = $i * $i;
                 $j <= $n + 1; $j += $i)
                $visited[$j] = true;
            array_push($primes, $i);
        }
}
 
function specialPrimeNumbers($n, $k)
{
    global $primes;
    SieveofEratosthenes($n);
    $count = 0;
    for ($i = 0; $i < count($primes); $i++)
    {
        for ($j = 0; $j < $i - 1; $j++)
        {
 
            // If a prime number is Special prime
            // number, then we increments the
            // value of k.
            if ($primes[$j] +
                $primes[$j + 1] + 1 == $primes[$i])
            {
                $count++;
                break;
            }
        }
 
        // If at least k Special prime numbers
        // are present, then we return 1.
        // else we return 0 from outside of
        // the outer loop.
        if ($count == $k)
            return true;
    }
    return false;
}
 
// Driver Code
$n = 27;
$k = 2;
if (specialPrimeNumbers($n, $k))
    echo "YES\n";
else
    echo "NO\n";
 
// This code is contributed by mits
?>

Javascript




<script>
 
    // Javascript program to check whether there
    // exist at least k or not in range [2..n]
     
    let primes = [];
   
    // Generating all the prime numbers
    // from 2 to n.
    function SieveofEratosthenes(n)
    {
        let visited = new Array(n);
        visited.fill(false);
        for (let i = 2; i <= n + 1; i++)
            if (!visited[i]) {
                for (let j = i * i; j <= n + 1; j += i)
                    visited[j] = true;
                primes.push(i);
            }
    }
 
    function specialPrimeNumbers(n, k)
    {
        SieveofEratosthenes(n);
        let count = 0;
        for (let i = 0; i < primes.length; i++) {
            for (let j = 0; j < i - 1; j++) {
 
                // If a prime number is Special prime
                // number, then we increments the
                // value of k.
                if (primes[j] + primes[j + 1] + 1
                    == primes[i]) {
                    count++;
                    break;
                }
            }
 
            // If at least k Special prime numbers
            // are present, then we return 1.
            // else we return 0 from outside of
            // the outer loop.
            if (count == k)
                return true;
        }
        return false;
    }
     
    let n = 27, k = 2;
    if (specialPrimeNumbers(n, k))
        document.write("YES");
    else
        document.write("NO");
 
</script>

Output:-

 YES

 

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :