Count pairs with sum as a prime number and less than n
Last Updated :
14 Apr, 2023
Given a positive integer n, count distinct number of pairs (x, y) that satisfy following conditions :
- (x + y) is a prime number.
- (x + y) < n
- x != y
- 1 <= x, y
Examples:
Input : n = 6
Output : 3
prime pairs whose sum is less than 6 are:
(1,2), (1,4), (2,3)
Input : 12
Output : 11
prime pairs whose sum is less than 12 are:
(1,2), (1,4), (2,3), (1,6), (2,5), (3,4),
(1,10), (2,9), (3,8), (4,7), (5,6)
Approach:
1) Find all prime numbers less than n using
Sieve of Sundaram
2) For each prime number p, count distinct
pairs that sum up to p.
For any odd number n, number of distinct pairs
that add upto n are n/2
Since, a prime number is a odd number, the
same applies for it too.
Example,
For prime number p = 7
distinct pairs that add upto p: p/2 = 7/2 = 3
The three pairs are (1,6), (2,5), (3,4)
For prime number p = 23
distinct pairs that add upto p: p/2 = 23/2 = 11
C++
#include <bits/stdc++.h>
using namespace std;
void SieveOfSundaram( bool marked[], int nNew)
{
for ( int i=1; i<=nNew; i++)
for ( int j=i; (i + j + 2*i*j) <= nNew; j++)
marked[i + j + 2*i*j] = true ;
}
int countPrimePairs( int n)
{
int nNew = (n-2)/2;
bool marked[nNew + 1];
memset (marked, false , sizeof (marked));
SieveOfSundaram(marked, nNew);
int count = 0, prime_num;
for ( int i=1; i<=nNew; i++)
{
if (marked[i] == false )
{
prime_num = 2*i + 1;
count = count + (prime_num / 2);
}
}
return count;
}
int main( void )
{
int n = 12;
cout << "Number of prime pairs: "
<< countPrimePairs(n);
return 0;
}
|
Java
class GFG
{
static void SieveOfSundaram( boolean marked[], int nNew)
{
for ( int i = 1 ; i <= nNew; i++)
for ( int j = i; (i + j + 2 * i * j) <= nNew; j++)
marked[i + j + 2 * i * j] = true ;
}
static int countPrimePairs( int n)
{
int nNew = (n - 2 ) / 2 ;
boolean marked[]= new boolean [nNew + 1 ];
SieveOfSundaram(marked, nNew);
int count = 0 , prime_num;
for ( int i = 1 ; i <= nNew; i++)
{
if (marked[i] == false )
{
prime_num = 2 * i + 1 ;
count = count + (prime_num / 2 );
}
}
return count;
}
public static void main (String[] args)
{
int n = 12 ;
System.out.println( "Number of prime pairs: " +
countPrimePairs(n));
}
}
|
Python3
def SieveOfSundaram(marked, nNew):
for i in range ( 1 , nNew + 1 ):
for j in range (i, nNew):
if i + j + 2 * i * j > nNew:
break
marked[i + j + 2 * i * j] = True
def countPrimePairs(n):
nNew = (n - 2 ) / / 2
marked = [ False for i in range (nNew + 1 )]
SieveOfSundaram(marked, nNew)
count, prime_num = 0 , 0
for i in range ( 1 , nNew + 1 ):
if (marked[i] = = False ):
prime_num = 2 * i + 1
count = count + (prime_num / / 2 )
return count
n = 12
print ( "Number of prime pairs: " ,
countPrimePairs(n))
|
C#
using System;
class GFG
{
static void SieveOfSundaram( bool [] marked,
int nNew)
{
for ( int i = 1; i <= nNew; i++)
for ( int j = i;
(i + j + 2 * i * j) <= nNew; j++)
marked[i + j + 2 * i * j] = true ;
}
static int countPrimePairs( int n)
{
int nNew = (n - 2) / 2;
bool [] marked = new bool [nNew + 1];
SieveOfSundaram(marked, nNew);
int count = 0, prime_num;
for ( int i = 1; i <= nNew; i++)
{
if (marked[i] == false )
{
prime_num = 2 * i + 1;
count = count + (prime_num / 2);
}
}
return count;
}
public static void Main ()
{
int n = 12;
Console.WriteLine( "Number of prime pairs: " +
countPrimePairs(n));
}
}
|
PHP
<?php
function SieveOfSundaram(& $marked , $nNew )
{
for ( $i = 1; $i <= $nNew ; $i ++)
for ( $j = $i ;
( $i + $j + 2 * $i * $j ) <= $nNew ; $j ++)
$marked [ $i + $j + 2 * $i * $j ] = true;
}
function countPrimePairs( $n )
{
$nNew = ( $n - 2) / 2;
$marked = array_fill (0, $nNew + 1, false);
SieveOfSundaram( $marked , $nNew );
$count = 0;
for ( $i = 1; $i <= $nNew ; $i ++)
{
if ( $marked [ $i ] == false)
{
$prime_num = 2 * $i + 1;
$count = $count + (int)( $prime_num / 2);
}
}
return $count ;
}
$n = 12;
echo "Number of prime pairs: " .
countPrimePairs( $n );
?>
|
Javascript
<script>
function SieveOfSundaram(marked, nNew)
{
for (i = 1; i <= nNew; i++)
for (j = i; (i + j + 2 * i * j) <= nNew; j++)
marked[i + j + 2 * i * j] = true ;
}
function countPrimePairs(n)
{
var nNew = parseInt((n - 2) / 2);
marked = Array.from({length: nNew + 1}, (_, i) => false );
SieveOfSundaram(marked, nNew);
var count = 0, prime_num;
for (i = 1; i <= nNew; i++)
{
if (marked[i] == false )
{
prime_num = 2 * i + 1;
count = count + parseInt(prime_num / 2);
}
}
return count;
}
var n = 12;
document.write( "Number of prime pairs: " +
countPrimePairs(n));
</script>
|
Output:
Number of prime pairs: 11
Time Complexity: O(N^2), As we are using Sieve of Sundaram, it takes O(N) time.
Auxiliary Space: O(N), We are using an additional boolean array of size N to mark the prime numbers.
Share your thoughts in the comments
Please Login to comment...