#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;

bool isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    if (num == 2) {
        return true;
    }
    if (num % 2 == 0) {
        return false;
    }

    for (int i = 3; i * i <= num; i += 2) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

int countPairs(int n) {
    std::vector<int> primes;
    std::unordered_set<int> primes_set;
    for (int i = 2; i < n; i++) {
        if (isPrime(i)) {
            primes.push_back(i);
            primes_set.insert(i);
        }
    }

    int count = 0;
    for (int a : primes) {
        int b = n - a;
        if (b < a) {
            break;
        }

        if (primes_set.count(b)) {
            count++;
        }
    }
    return count;
}

int main() {
    int n;
    cin >> n;

    std::cout << countPairs(n) << std::endl;
    return 0;
}
// 64 位输出请用 printf("%lld")

解题思路

先找到小于n的所有素数,把这些素数分别存放在一个vector中和一个unordered_set中,然后遍历vector中的每个数。

由a代替,然后b代替n-a,查看b是否在unordered_set中,如果在,count++。

一旦发现b小于a时,就直接退出循环,避免重复计算。