Prime Pair with Target Sum

Given a number n, find out if n can be expressed as a+b, where both a and b are prime numbers. If such a pair exists, return the values of a and b, otherwise return [-1,-1] as an array of size 2.
Note: If [a, b] is one solution with a <= b, and [c, d] is another solution with c <= d, and a < c then  [a, b] is considered as our answer.

Examples

Input: n = 10
Output: 3 7
Explanation: There are two possiblities 3, 7 & 5, 5 are both prime & their sum is 10, but we'll pick 3, 7 as 3 < 5.
Input: n = 3
Output: -1 -1
Explanation: There are no solutions to the number 3.

Expected Time Complexity: O(n*loglog(n))
Expected Auxiliary Space: O(n)

Constraints:
2 <= n <= 106


Approach 01:

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<int> getPrimes(int n) {
        vector<int> result(2, -1);  // Initialize with -1 indicating no pair found
        
        if (n <= 2)
            return result;  // No prime pair for n <= 2
        
        vector<bool> is_prime(n + 1, true);  // Initialize all numbers as prime
        is_prime[0] = is_prime[1] = false;  // 0 and 1 are not prime numbers
        
        // Sieve of Eratosthenes algorithm to find primes up to n
        for (int i = 2; i * i <= n; ++i) {
            if (is_prime[i]) {
                for (int j = i * i; j <= n; j += i) {
                    is_prime[j] = false;  // Mark multiples of i as non-prime
                }
            }
        }
        
        // Find the prime pair (x, y) such that x + y = n
        for (int x = 2; x <= n / 2; ++x) {
            int y = n - x;
            if (is_prime[x] && is_prime[y]) {
                // If both x and y are prime, store them in result and return
                result[0] = x;
                result[1] = y;
                return result;
            }
        }
        
        return result;  // Return {-1, -1} if no prime pair found
    }
};
class Solution:
    def getPrimes(self, n: int) -> list:
        result = [-1, -1]  # Initialize with -1 indicating no pair found
        
        if n <= 2:
            return result  # No prime pair for n <= 2
        
        is_prime = [True] * (n + 1)  # Initialize all numbers as prime
        is_prime[0] = is_prime[1] = False  # 0 and 1 are not prime numbers
        
        # Sieve of Eratosthenes algorithm to find primes up to n
        for i in range(2, int(n**0.5) + 1):
            if is_prime[i]:
                for j in range(i * i, n + 1, i):
                    is_prime[j] = False  # Mark multiples of i as non-prime
        
        # Find the prime pair (x, y) such that x + y = n
        for x in range(2, n // 2 + 1):
            y = n - x
            if is_prime[x] and is_prime[y]:
                # If both x and y are prime, store them in result and return
                result[0] = x
                result[1] = y
                return result
        
        return result  # Return [-1, -1] if no prime pair found

 

Complexity:

  • Time Complexity:
    O(nlog(log(n)))O(n \log(\log(n)))
  • Space Complexity:
    O(n)O(n)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top