#zSybttg060204. 1622:Goldbach’s Conjecture

1622:Goldbach’s Conjecture

1622:Goldbach’s Conjecture

题目描述

哥德巴赫猜想:任何大于 44 的偶数都可以拆成两个奇素数之和。 比如:

  • 8=3+58 = 3 + 5
  • 20=3+17=7+1320 = 3 + 17 = 7 + 13
  • 42=5+37=11+31=13+29=19+2342 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23

你的任务是:验证小于 10610^6 的数满足哥德巴赫猜想。

输入格式

多组数据,每组数据一个 nn

读入以 00 结束。

输出格式

对于每组数据,输出形如 n = a + b,其中 a,ba, b 是奇素数。若有多组满足条件的 a,ba, b,输出 bab - a 最大的一组。

若无解,输出 "Goldbach’s conjecture is wrong."

样例

样例输入 #1

8
20
42
0

样例输出 #1

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

样例解释 #1

  • n=8n=83+5=83+5=8,且 53=25-3=2 是最大差值(只有一组)。
  • n=20n=20:有 3+173+177+137+13,差值分别为 141466,选择 3+173+17
  • n=42n=42:有 5+375+3711+3111+3113+2913+2919+2319+23,差值分别为 32322020161644,选择 5+375+37

数据范围

对于全部数据,6n1066 \le n \le 10^6

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题需要预处理 10610^6 以内的所有素数(可以用埃氏筛或线性筛)。然后对于每个偶数 nn,从最小的奇素数 33 开始枚举 aa,检查 aanan-a 是否都是素数。由于要求 bab-a 最大,即 aa 尽可能小(因为 b=nab = n-a,差值 ba=n2ab-a = n-2aaa 越小差值越大),所以找到第一个满足条件的 aa 即可。注意 aabb 必须是奇素数,因此 aa33 开始,每次增加 22(因为偶数除了 22 都不是素数,而 22 是偶素数,但题目要求奇素数,所以 aa 不能是 22)。

如果找不到这样的 aa,则输出错误信息。但根据哥德巴赫猜想,在 n106n \le 10^6 范围内应该都有解。

时间复杂度:预处理素数 O(NloglogN)O(N \log \log N),每次查询 O(n)O(n) 枚举 aa。由于 nn 最大 10610^6,且多组数据,可能超时。优化:可以只枚举素数,而不是所有奇数。可以用一个布尔数组 is_prime 记录每个数是否为素数,然后枚举素数 aa,直到 an/2a \le n/2。因为如果 a>n/2a > n/2,则 b<ab < a,但我们可以要求 aba \le b 以避免重复,且差值最大时 aa 最小,所以 an/2a \le n/2