• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【哥德巴赫猜想】

题目

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;
}

posted on 2025-12-17 22:02  RomanLin  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3