题目解析:哥德巴赫猜想方案数(偶数拆成两个素数之和)
一、题意梳理
* 输入一个大于 2 的偶数 nnn(4≤n≤1064 \le n \le 10^64≤n≤106)。
* 求把 nnn 写成两个质数之和的方案数;无序计数,即 3+73+73+7 与 7+37+37+3 算同一种。
* 样例:n=4→1n=4 \to 1n=4→1(2+22+22+2);n=10→2n=10 \to 2n=10→2(3+73+73+7、5+55+55+5)。
二、关键观察
观察 1(去重):任一方案 {p, n−p}\{p,\ n-p\}{p, n−p} 中,恰有一个数 ≤n/2\le n/2≤n/2(相等时 p=n/2p=n/2p=n/2 只出现一次)。因此只枚举较小的那个素数 p∈[2, ⌊n/2⌋]p \in [2,\ \lfloor n/2 \rfloor]p∈[2, ⌊n/2⌋],检查 n−pn-pn−p 是否也是素数,即可做到不重不漏。
观察 2(需要批量判素):枚举过程中要对约 n/2n/2n/2 个数判素。若每次用 O(n)O(\sqrt{n})O(n ) 试除,总代价 ≈n2n≈5×108\approx \frac{n}{2}\sqrt{n} \approx 5\times10^8≈2n n ≈5×108,在 n=106n=10^6n=106 下太慢。正确做法是先用埃氏筛(或线性筛)一次性预处理 [2,n][2, n][2,n] 内所有素数,之后 O(1)O(1)O(1) 查表。
三、算法流程
1. 埃拉托斯特尼筛:isPrime[0]=isPrime[1]=false;从 2 起,把每个素数的倍数(从 i2i^2i2 开始)标记为合数。复杂度 O(nloglogn)O(n \log\log n)O(nloglogn)。
2. 统计:for p = 2 .. n/2,若 isPrime[p] && isPrime[n-p] 则答案 +1。复杂度 O(n)O(n)O(n)。
四、参考代码
五、样例验证
* n=4n=4n=4:p=2p=2p=2,4−2=24-2=24−2=2 是素数 → 计 1。输出 1 ✓
* n=10n=10n=10:
p n−p 是否都素 计数 2 8 8 非素 × 3 7 ✔ +1 4 6 4 非素 × 5 5 ✔ +1 输出 2 ✓