【哥德巴赫猜想】
题目
https://codeforces.com/problemset/problem/735/D
题解
弱哥德巴赫猜想:任意一个大于等于 9 的奇数,都可以表示为三个素数之和,如 11 = 3 + 3 + 5。该猜想已在 2013 年由数学家哈罗德·贺欧夫各特发表两篇论文彻底证明。
强哥德巴赫猜想:任意一个大于等于 6 的偶数,都可以表示为两个素数之和,如 6 = 3 + 3。目前该猜想尚未被完全证明,目前最优最接近的是陈景润的“1 + 2”。目前科学家已经证明到 1e30 及以上了,在算竞的数据范围内可以作为定理使用。
结合弱哥猜和强哥猜的结论,可以知道一个数要由多个素数相加得到,至多只需要由三个素数即可。若一个数本身就是质数,则明显只需要由一个素数组成;若是偶数(在算竞赛能使用的 long long 范围内都成立)只需要由两个素数相加得到;若是非质数奇数,可能可以由两个素数累加得到,也可能是由三个素数累加得到。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n;
int ans = 1;// 若本身就是质数,则答案明显为 1
cin >> n;
if (n & 1) {// 弱哥猜:奇数至多只会拆为 3 个质数相加
for (int i = 2; i <= n / i; ++ i) {
if (n % i == 0) {// n不是质数
ans = 2;// 拆为 n = 2 + (n-2),判断(n-2)是不是质数,若是答案则为 2
int j = n - 2;
for (int k = 2; k <= j / k; ++ k) {// 判断(n-2)是不是质数
if (j % k == 0) {// (n-2)不是质数
ans = 3;// 由弱哥猜可知一个奇数必定可以拆为三个质数之和
break;
}
}
break;
}
}
} else if (n > 2) ans = 2;// 偶数(除了 2 以外)由哥德巴赫猜想可知答案为 2(在算竞的范围内哥猜是正确的)
cout << ans << '\n';
return 0;
}
浙公网安备 33010602011771号