# 2761. Prime Pairs With Target Sum

## Description

You are given an integer n. We say that two integers x and y form a prime number pair if:

• 1 <= x <= y <= n
• x + y == n
• x and y are prime numbers

Return the 2D sorted list of prime number pairs [xi, yi]. The list should be sorted in increasing order of xi. If there are no prime number pairs at all, return an empty array.

Note: A prime number is a natural number greater than 1 with only two factors, itself and 1.

Example 1:

Input: n = 10
Output: [[3,7],[5,5]]
Explanation: In this example, there are two prime pairs that satisfy the criteria.
These pairs are [3,7] and [5,5], and we return them in the sorted order as described in the problem statement.


Example 2:

Input: n = 2
Output: []
Explanation: We can show that there is no prime number pair that gives a sum of 2, so we return an empty array.


Constraints:

• 1 <= n <= 106

## Solutions

Solution 1: Preprocessing + Enumeration

First, we pre-process all the prime numbers within the range of $n$, and record them in the array $primes$, where $primes[i]$ is true if $i$ is a prime number.

Next, we enumerate $x$ in the range of $[2, \frac{n}{2}]$. In this case, $y = n - x$. If both $primes[x]$ and $primes[y]$ are true, then $(x, y)$ is a pair of prime numbers, which is added to the answer.

After the enumeration is complete, we return the answer.

The time complexity is $O(n \log \log n)$ and the space complexity is $O(n)$, where $n$ is the number given in the problem.

• class Solution {
public List<List<Integer>> findPrimePairs(int n) {
boolean[] primes = new boolean[n];
Arrays.fill(primes, true);
for (int i = 2; i < n; ++i) {
if (primes[i]) {
for (int j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
List<List<Integer>> ans = new ArrayList<>();
for (int x = 2; x <= n / 2; ++x) {
int y = n - x;
if (primes[x] && primes[y]) {
}
}
return ans;
}
}

• class Solution {
public:
vector<vector<int>> findPrimePairs(int n) {
bool primes[n];
memset(primes, true, sizeof(primes));
for (int i = 2; i < n; ++i) {
if (primes[i]) {
for (int j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
vector<vector<int>> ans;
for (int x = 2; x <= n / 2; ++x) {
int y = n - x;
if (primes[x] && primes[y]) {
ans.push_back({x, y});
}
}
return ans;
}
};

• class Solution:
def findPrimePairs(self, n: int) -> List[List[int]]:
primes = [True] * n
for i in range(2, n):
if primes[i]:
for j in range(i + i, n, i):
primes[j] = False
ans = []
for x in range(2, n // 2 + 1):
y = n - x
if primes[x] and primes[y]:
ans.append([x, y])
return ans


• func findPrimePairs(n int) (ans [][]int) {
primes := make([]bool, n)
for i := range primes {
primes[i] = true
}
for i := 2; i < n; i++ {
if primes[i] {
for j := i + i; j < n; j += i {
primes[j] = false
}
}
}
for x := 2; x <= n/2; x++ {
y := n - x
if primes[x] && primes[y] {
ans = append(ans, []int{x, y})
}
}
return
}

• function findPrimePairs(n: number): number[][] {
const primes: boolean[] = new Array(n).fill(true);
for (let i = 2; i < n; ++i) {
if (primes[i]) {
for (let j = i + i; j < n; j += i) {
primes[j] = false;
}
}
}
const ans: number[][] = [];
for (let x = 2; x <= n / 2; ++x) {
const y = n - x;
if (primes[x] && primes[y]) {
ans.push([x, y]);
}
}
return ans;
}