跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

GESP 八级 C++ 复习资料:倍增与数论组合数学

整理 GESP 八级 C++ 考试核心考点,涵盖倍增算法中的最近公共祖先(LCA)实现原理及代码,以及数论与组合数学基础知识,包括加减乘除计数原理、阶乘、排列组合、鸽巢原理和卡特兰数的定义与应用场景。

RustyLab发布于 2026/3/23更新于 2026/9/816K 浏览

主要考察点分为五个部分:倍增、最短路、最小生成树、数论和组合数学。

倍增

倍增,就是成倍增长。在线性递推超时的时候,我们可以只获取在 k 的整数次幂位置上的值。当需要其他位置上的值时,我们通过 '任意整数可以被分为若干个 k 的次幂项的和' 这一性质,使用获取过的值来得到想要求到的值。 倍增有三大应用场面,分别是 快速幂、LCA、RMQ,快速幂不常考。

倍增 LCA

LCA(Lowest Common Ancestor)为树上算法,意为 最近公共祖先。定义:若干个点的公共祖先中离根 最远 的点就叫这些点的最近公共祖先。 例如下图中,4 和 6 的最近公共祖先是 2;2、4、6 的最近公共祖先是 2。

在这里插入图片描述

在 LCA 中,我们可以用 p[x][i] 表示 x 的第 2^i 个祖先,p[x][0] 就是 x 的父亲,p[x][i] 就是 x 的第 2^{i-1} 个祖先的第 2^{i-1} 个祖先。 同时我们维护数组 dep,dep[i] 表示 i 离根的距离。 我们可以通过 dfs 求出 p 数组和 dep 数组。 先给出 预处理 的 dfs 代码:

void dfs(int now, int fa) {
    dep[now] = dep[fa] + 1;
    p[now][0] = fa;
    for (int i = 1; i <= 20; ++i) p[now][i] = p[p[now][i-1]][i-1]; // i=[1,20],核心
    for(auto node : edge[now]) if(node != fa) dfs(node, now);
}

现在我们着重考虑 2 个点的 LCA。首先,我们检查 dep_x >= dep_y,若不满足,则交换 x, y。接着,我们让 x 通过跳跃到达 y 的所在层数。这时,如果我们发现 x == y,则直接返回 x;否则两个点同时往上跳跃,直到 p[x][0] = p[y][0],最后返回 p[x][0] 即可。 LCA 函数:

int lca(int x, int y) {
    if(dep[x] < dep[y]) swap(x, y);
    for (int i = 20; i >= 0; --i) if(dep[p[x][i]] >= dep[y]) x = p[x][i];
    if(x == y) return x;
    for (int i = 20; i >= 0; --i) if(p[x][i] != p[y][i]) x = p[x][i], y = p[y][i];
    return p[x][0];
}

建议尝试练习洛谷 P3379。

数论与组合数学

计数原理

加法计数原理

完成一件事,有 n 类办法,每类办法 互相独立。

  • 第一类有 m1 种方法;
  • 第二类有 m2 种方法;
  • 第三类有 m3 种方法;
  • ……
  • 第 n 类有 mn 种方法。

即总方法数是 m1 + m2 + m3 + ⋯ + mn。 关键词:分类、任选其一、互不干扰。

乘法计数原理

完成一件事,需要分成 n 个步骤,步骤之间 有先后顺序。

  • 第一步有 m1 种方法;
  • 第二步有 m2 种方法;
  • 第三步有 m3 种方法;
  • ……
  • 第 n 步有 mn 种方法。

即总方法数是 m1 × m2 × m3 × ⋯ × mn。 关键词:分步、缺一不可、先后顺序。

区分方法

能 一步 做完 → 分类 → 加法 → '或'。 必须 多步 做完 → 分步 → 乘法 → '且'、'先……再……' 。

阶乘

n! = ∏_{i=1}^{n} i = n × (n-1) × (n-2) × ⋯ × 2 × 1,注意 0! = 1。

排列

从 n 个不同元素中,有序 取出 m 个排成一列,叫排列,通常记作 A_n^m 或 P_n^m。

A_n^m = n! / (n-m)! = ∏_{i=n-m+1}^{n} i。

全排列:A_n^n = n!

组合

从 n 个不同元素中,无序 取出 m 个组成一组,叫组合,通常记作 C_n^m 或 \binom{n}{m}。

C_n^m = A_n^m / m! = n! / (m!(n-m)!). 性质:

  • C_n^m = C_n^{n-m}(对称性);
  • C_n^0 = C_n^n = 1;
  • C_n^m + C_n^{m+1} = C_{n+1}^{m+1}(杨辉三角);
  • ∑_{i=0}^{n} C_n^i = 2^n。

鸽巢原理(抽屉原理)

基本形式

把 n+1 个物体放入 n 个抽屉中,则 至少有一个抽屉 里包含 至少两个 物体。

推广形式

把 km+1 个物体放入 k 个抽屉中,则至少有一个抽屉里包含至少 m+1 个物体。

典型应用
  • 任意 13 个人中,至少有 2 个人的生日在同一个月;
  • 任意 5 个整数中,至少有 3 个整数的和是 3 的倍数。

卡特兰数

定义

第 n 个卡特兰数记作 Catalan(n),公式为: Catalan(n) = 1/(n+1) * C_{2n}^n = (2n)! / ((n+1)! * n!)。

初始值

Catalan(0) = 1,Catalan(1) = 1,Catalan(2) = 2,Catalan(3) = 5,Catalan(4) = 14。

典型应用场景
  • 合法括号匹配的数量:n 对括号的合法组合数为 Catalan(n);
  • 出栈序列的数量:n 个元素进栈后,合法出栈序列数为 Catalan(n);
  • 凸多边形三角剖分:n 边形的三角剖分方案数为 Catalan(n-2)。

目录

  1. 倍增
  2. 倍增 LCA
  3. 数论与组合数学
  4. 计数原理
  5. 加法计数原理
  6. 乘法计数原理
  7. 区分方法
  8. 阶乘
  9. 排列
  10. 组合
  11. 鸽巢原理(抽屉原理)
  12. 基本形式
  13. 推广形式
  14. 典型应用
  15. 卡特兰数
  16. 定义
  17. 初始值
  18. 典型应用场景

更多推荐文章

查看全部
  • Nginx 作为网络出口网关:架构设计与实践指南
  • Windows 系统多 JDK 版本快速切换方案
  • LeetCode 滑动窗口算法进阶解析
  • Verilator DPI-C 实战:Verilog 与 C/C++ 混合仿真
  • 读李宁《AIGC 自动化编程》:大模型辅助开发的分解与合并心法
  • 二分查找算法初阶:LeetCode 实战解析
  • GPT-SoVITS与Whisper组合:实现语音转写与克隆一体化
  • 基于 FastAPI 自动构建 SSE MCP 服务器
  • Trae IDE 结合 Figma 实现设计稿智能生成前端代码
  • 程序员为何要坚持技术写作
  • 大厂为何对大模型投入变得谨慎?
  • AI 编程中的 Skills:概念、用法与 Java 实战示例
  • 宇树 G1 人形机器人强化学习训练实战指南
  • 从 Webhook 到 OpenClaw:钉钉周报机器人进化史
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • ESP32-S3 微型无人机系统架构与飞控实现
  • C++ 核心面试题总结:语法、内存与类机制详解
  • Chroma + Ollama + Llama 3.1 搭建本地知识库
  • OpenClaw WebSocket Channel 开发实战:构建自定义 AI 通信通道
  • 使用 ClaudeCode 与 Figma-MCP 实现 UI 设计 1:1 前端还原

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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