跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

C++ 数论进阶:裴蜀定理与扩展欧几里得算法实战

裴蜀定理指出线性组合的最小正整数解即为最大公约数。通过扩展欧几里得算法讲解不定方程求解,结合 CSP-S 真题 P4549 演示多变量 GCD 计算,提供 C++ 实现代码及关键细节分析,帮助掌握数论模板应用。重点涵盖递归边界处理、全零特判及负数取绝对值等易错点,适合准备提高组竞赛的选手阅读。

zhang发布于 2026/3/27更新于 2026/4/253 浏览
C++ 数论进阶:裴蜀定理与扩展欧几里得算法实战

C++ 数论进阶:裴蜀定理与扩展欧几里得算法实战

数论在信息学竞赛中是个绕不开的大山,尤其是涉及不定方程和模运算的部分。今天咱们不整虚的,直接聊聊裴蜀定理(Bézout's identity)以及它背后的核心工具——扩展欧几里得算法。

学习目标

  1. 理清脉络:搞懂同余、裴蜀定理、扩展欧几里得、乘法逆元之间的逻辑链条。
  2. 掌握核心:能熟练手写扩展欧几里得算法,解决线性不定方程。
  3. 实战应用:面对 CSP-S 级别的数论模板题,知道怎么快速建模。

核心概念回顾

裴蜀定理其实就一句话:对于任意整数 $a, b$,存在整数 $x, y$ 使得 $ax + by = d$,其中 $d = \gcd(a, b)$。而且,$d$ 是所有形如 $ax+by$ 的整数中最小的正整数。

这意味着什么?意味着只要你能算出最大公约数,你就知道这个线性组合的最小值是多少。而求最大公约数的经典方法就是欧几里得算法,那如果要找出具体的 $x, y$ 呢?这时候就需要扩展欧几里得算法(exgcd)了。

代码实现与解析

写 exgcd 的时候,很多人容易在递归边界或者符号上栽跟头。这里给个标准写法,顺便解释一下为什么这么写。

// 扩展欧几里得算法
// 返回 gcd(a, b),同时更新 x, y 使得 ax + by = gcd(a, b)
long long exgcd(long long a, long long b, long long &x, long long &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    long long d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

注意看递归调用那里 exgcd(b, a % b, y, x),这里直接把 x 和 y 传反了。这是为了利用数学推导中的代换关系,省去了中间变量。实际运行时会发现,当 $b=0$ 时,$a\cdot1 + 0\cdot0 = a$,这就是初始状态。回溯过程中通过 $y -= a/b*x$ 来修正系数。

实战案例:P4549 裴蜀定理

题目背景

给定一个包含 $n$ 个整数的序列 $a_1, a_2, \dots, a_n$。我们需要找到一个最小的正整数 $k$,使得存在整数 $x_1, x_2, \dots, x_n$ 满足 $\sum_{i=1}^n a_i x_i = k$。

这其实就是裴蜀定理的多变量推广。结论很简单:这个最小的正整数 $k$ 就是所有 $a_i$ 的最大公约数。如果所有数都是 0,那答案就是 0。

解题思路

别被多变量吓到,GCD 的性质是结合的。$\gcd(a, b, c) = \gcd(\gcd(a, b), c)$。所以我们可以用循环累加的方式求整个序列的 GCD。

参考代码

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

long long exgcd(long long a, long long b, long long &x, long long &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    long long d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main() {
    int n;
    if (!(cin >> n)) return 0;
    
    vector<long long> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    // 特殊情况处理:如果所有数都是 0
    bool all_zero = true;
    for (long long val : a) {
        if (val != 0) {
            all_zero = false;
            break;
        }
    }
    
    if (all_zero) {
        cout << 0 << endl;
        return 0;
    }

    // 计算所有数的最大公约数
    long long result = 0;
    for (long long val : a) {
        result = exgcd(result, val, x, y); // 这里的 x, y 不需要关心具体值,只需要结果
    }
    
    // 输出绝对值,因为 GCD 定义为正
    cout << abs(result) << endl;
    
    return 0;
}

细节提醒

  1. 数据类型:输入可能很大,记得用 long long,虽然 P4549 的数据范围通常不会爆 int,但养成习惯比较好。
  2. 全零情况:很多选手会忽略 $a_i$ 全为 0 的情况,导致 WA。上面代码里专门加了判断。
  3. 负数处理:GCD 的结果应该是正的,所以最后取个 abs() 更稳妥。

总结

裴蜀定理的核心在于理解'线性组合'与'最大公约数'的关系。在实际做题时,看到类似 $ax + by = c$ 的不定方程,或者多变量线性组合求极值的问题,第一时间反应出 GCD 就能省下大量思考时间。配合扩展欧几里得算法,这类数论题基本就拿下大半了。

下次遇到分数模运算或者乘法逆元,你会发现它们本质上还是这套逻辑的延伸。保持手感,多敲几遍 exgcd,直到肌肉记忆形成。

目录

  1. C++ 数论进阶:裴蜀定理与扩展欧几里得算法实战
  2. 学习目标
  3. 核心概念回顾
  4. 代码实现与解析
  5. 实战案例:P4549 裴蜀定理
  6. 题目背景
  7. 解题思路
  8. 参考代码
  9. 细节提醒
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 使用 Java 自动加载 OpenCV 调用 YOLO 模型检测
  • 中小团队低成本搭建项目管理系统:Ubuntu 下 Dootask 私有化部署实战
  • Python 与前端集成:构建全栈应用
  • Flutter 三方库 eth_sig_util 的鸿蒙化适配指南
  • Stable Diffusion Windows 环境搭建与使用指南
  • HTML5 结合 AI 实现智能场景渲染
  • 大模型加速落地汽车领域,车企探索智能化新路径
  • 前端文件上传处理最佳实践
  • 无人机 SLAM 单目深度先验融合实践:基于 lingbot-depth 模型
  • 通义万相 2.1 视频生成模型特性与算力平台概述
  • 生物医学 Go 编程:高性能计算与精准医疗实战案例 (一)
  • Linux 服务器通用安全加固指南 - 基本系统安全
  • Node-RED 用户登录、鉴权与权限控制流程解析
  • OpenClaw ACP 协议深度解析:IDE 直接驱动 AI Agent
  • AirSim 无人机仿真入门:使用 Python 控制起飞与降落
  • Dify MCP Server 插件:将工作流发布为第三方可调用服务
  • Linux 进程地址空间与虚拟内存机制解析
  • 文心一言大模型本地部署与微调应用实战
  • 更高级的 RAG 架构:提升 AI 大模型回答准确性
  • C++ 类与对象核心知识点总结

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online