数论&数学
一、基础数论
1.1 整除理论
基本概念
- 整除:\(a|b\) 表示存在整数 \(c\) 使得 \(b=ac\)
- 约数与倍数:如果 \(a|b\),则 \(a\) 是 \(b\) 的约数,\(b\) 是 \(a\) 的倍数
- 质数(素数):大于1且只能被1和自身整除的正整数
- 合数:大于1且不是质数的正整数
质数判定
判断一个数 \(n\) 是否为质数,最基本的算法是试除法,时间复杂度 \(O(\sqrt{n})\)。可以通过只检查到 \(\sqrt{n}\) 和跳过偶数进行优化。
质因数分解
将正整数 \(n\) 分解质因数,输出所有质因数及其指数。基于试除法,每次找到一个质因子就除尽,时间复杂度 \(O(\sqrt{n})\)。
1.2 同余理论
基本概念
- 同余:\(a \equiv b \pmod{m}\) 表示 \(m\) 整除 \(a-b\)
- 模运算性质:
- \((a + b) \bmod m = (a \bmod m + b \bmod m) \bmod m\)
- \((a - b) \bmod m = (a \bmod m - b \bmod m + m) \bmod m\)
- \((a \times b) \bmod m = (a \bmod m \times b \bmod m) \bmod m\)
- 逆元:如果 \(a \times b \equiv 1 \pmod{m}\),则 \(b\) 是 \(a\) 在模 \(m\) 下的逆元
快速幂(模意义下)
计算 \(a^b \bmod m\),使用二分思想,时间复杂度 \(O(\log b)\)。通过将指数 \(b\) 的二进制分解,将幂运算转化为多次平方和乘法。
求逆元
给定 \(a\) 和质数 \(p\),求 \(a\) 在模 \(p\) 下的逆元。常用方法有:
- 费马小定理:当 \(p\) 为质数时,\(a^{p-2} \equiv a^{-1} \pmod{p}\)
- 扩展欧几里得算法:解 \(ax + py = 1\),得到的 \(x\) 就是 \(a\) 在模 \(p\) 下的逆元
1.3 最大公约数与最小公倍数
基本概念
- 最大公约数(GCD):\(\gcd(a,b)\) 表示 \(a\) 和 \(b\) 的最大公约数
- 最小公倍数(LCM):\(\operatorname{lcm}(a,b) = a \times b / \gcd(a,b)\)
- 欧几里得算法:\(\gcd(a,b) = \gcd(b, a \bmod b)\)
欧几里得算法
求两个数的最大公约数,基于辗转相除原理,递归或迭代实现。扩展欧几里得算法可以求出 \(ax + by = \gcd(a,b)\) 的一组整数解。
1.4 素数筛法
埃拉托斯特尼筛法
筛选出 \(1 \sim n\) 中的所有素数,时间复杂度 \(O(n \log \log n)\)。从 \(2\) 开始,标记每个素数的倍数,剩余未标记的就是素数。
欧拉筛法(线性筛)
线性时间复杂度筛选素数,时间复杂度 \(O(n)\)。每个合数只被它的最小质因子筛掉一次,避免重复标记。
区间筛法
筛选区间 \([a,b]\) 内的所有素数,其中 \(b-a \leq 10^6\),\(b \leq 10^{12}\)。先用普通筛法筛选出 \(\sqrt{b}\) 以内的素数,然后用这些素数去标记区间内的合数。
二、同余方程
2.1 线性同余方程
求解线性同余方程
求解 \(ax \equiv b \pmod{m}\)。使用扩展欧几里得算法求出 \(ax + my = g\) 的解,其中 \(g = \gcd(a,m)\)。当 \(g|b\) 时,方程有解,解数为 \(g\) 个。
2.2 中国剩余定理
中国剩余定理
求解同余方程组 \(x \equiv a_i \pmod{m_i}\),其中模数两两互质。通过构造解 \(x = \sum (a_i \times M_i \times \operatorname{inv}(M_i, m_i))\),其中 \(M = \prod m_i\),\(M_i = M/m_i\)。
扩展中国剩余定理
模数不一定互质的情况。通过合并方程逐步求解,使用扩展欧几里得算法解线性同余方程。
2.3 二次剩余
二次剩余判定
判断 \(a\) 是否是模 \(p\) 的二次剩余(\(p\) 为奇素数)。使用欧拉准则:\(a\) 是模 \(p\) 二次剩余当且仅当 \(a^{(p-1)/2} \equiv 1 \pmod{p}\)。
Cipolla算法
求解 \(x^2 \equiv n \pmod{p}\)。随机选择 \(a\) 使得 \(a^2-n\) 不是二次剩余,然后在复数域中计算 \((a + \sqrt{a^2-n})^{(p+1)/2}\),实部即为解。
三、数论函数
3.1 积性函数
常见积性函数
- 欧拉函数 \(\varphi(n)\):\(1 \sim n\) 中与 \(n\) 互质的数的个数
- 莫比乌斯函数 \(\mu(n)\)
- 约数个数函数 \(d(n)\)
- 约数和函数 \(\sigma(n)\)
欧拉函数
计算欧拉函数值,单个计算可以使用质因数分解公式,批量计算可以使用线性筛。
约数个数与约数和
计算 \(1 \sim n\) 中每个数的约数个数和约数和,可以使用线性筛在线性时间内完成。
3.2 莫比乌斯反演
莫比乌斯函数
计算莫比乌斯函数 \(\mu(n)\)。定义:\(\mu(1)=1\);若 \(n\) 有平方因子则 \(\mu(n)=0\);否则 \(\mu(n)=(-1)^k\),其中 \(k\) 为 \(n\) 的不同质因子个数。
莫比乌斯反演公式
若 \(F(n) = \sum_{d|n} f(d)\),则 \(f(n) = \sum_{d|n} \mu(d) F(n/d)\)。用于求解包含 \(\gcd\) 的求和问题。
3.3 杜教筛
杜教筛求前缀和
求 \(\sum_{i=1}^n \varphi(i)\) 和 \(\sum_{i=1}^n \mu(i)\) 等积性函数前缀和。结合线性筛预处理前 \(N\) 项(通常 \(N=n^{2/3}\)),剩余部分使用递归和记忆化。
四、组合数学
4.1 基本计数原理
加法原理与乘法原理
计数问题的基本工具。加法原理用于分类计数,乘法原理用于分步计数。
路径计数
从网格左上角到右下角,只能向右或向下走,求路径数。可以使用组合数公式 \(C(m+n-2, m-1)\) 或动态规划。
4.2 排列组合
组合数计算
计算组合数 \(C(n,k)\)。方法有:
- 递推公式 \(C(n,k)=C(n-1,k-1)+C(n-1,k)\)
- 公式法 \(C(n,k)=n!/(k!(n-k)!)\)
- 模质数下的组合数(使用逆元)
卡特兰数
卡特兰数 \(C_n = C(2n,n)/(n+1)\)。出现在许多组合计数问题中,如括号匹配、出栈序列、二叉树计数等。
4.3 生成函数
普通生成函数
将计数问题转化为多项式系数问题。例如,用1元、2元、5元纸币支付 \(n\) 元的方法数对应的生成函数为 \(1/[(1-x)(1-x^2)(1-x^5)]\)。
指数生成函数
用于排列计数问题。\(n\) 个元素的排列,其中元素 \(i\) 有 \(a_i\) 个,排列数为 \(n!/(a_1!a_2!\cdots a_k!)\)。
4.4 容斥原理
容斥原理应用
求 \(1 \sim n\) 中不能被 \(a_1,a_2,\dots,a_m\) 整除的数的个数。通过计算能被至少一个 \(a_i\) 整除的数,用容斥原理求解。
错排问题
\(n\) 个元素的排列,每个元素都不在原来位置的排列数。公式:\(D_n = (n-1)(D_{n-1}+D_{n-2})\),也可以用容斥原理 \(D_n = n! \sum_{i=0}^n (-1)^i/i!\)。
五、线性代数
5.1 矩阵快速幂
斐波那契数列
求第 \(n\) 个斐波那契数,\(n \leq 10^{18}\)。使用矩阵快速幂,将线性递推转化为矩阵幂运算。
矩阵快速幂模板
通用矩阵快速幂模板,用于求解线性递推关系、图论中的路径计数等。
5.2 高斯消元
高斯消元解线性方程组
求解 \(n\) 元线性方程组。通过行变换将增广矩阵化为行阶梯形,然后回代求解。支持实数解和判断无解、无穷多解。
异或方程组
求解模 \(2\) 意义下的线性方程组。使用高斯消元,通过异或操作进行行变换。
5.3 线性基
线性基模板
处理向量空间的一组基,常用于求解最大异或和、判断数能否由集合异或得到、求第 \(k\) 小异或值等。
线性基应用
求子集异或和第 \(k\) 小、求最大异或和等。线性基可以将原集合转化为一组线性无关的向量,简化问题。
六、多项式与生成函数
6.1 FFT/NTT
快速傅里叶变换(FFT)
多项式乘法的高效算法,时间复杂度 \(O(n \log n)\)。将系数表示转化为点值表示,相乘后再转化回来。
快速数论变换(NTT)
模意义下的FFT,使用原根代替复数单位根。常用模数 \(998244353\),原根 \(3\)。
6.2 多项式运算
多项式求逆
求 \(B(x)\) 使得 \(A(x)B(x) \equiv 1 \pmod{x^n}\)。使用牛顿迭代法,从低位到高位逐步求解。
多项式开根
求 \(B(x)\) 使得 \(B(x)^2 \equiv A(x) \pmod{x^n}\)。使用牛顿迭代法,结合多项式求逆。
七、博弈论
7.1 Nim游戏
Nim游戏
有 \(n\) 堆石子,每堆有 \(a_i\) 个,两人轮流取,每次可以从任意一堆中取任意多个,无法操作者输。先手必胜当且仅当所有石子数的异或和不为 \(0\)。
阶梯Nim游戏
有 \(n\) 级阶梯,每级有 \(a_i\) 个石子,每次可以将任意级阶梯的任意多个石子移到下一级。只考虑奇数级台阶的石子数的异或和,不为 \(0\) 则先手必胜。
7.2 SG函数
SG函数模板
计算有向无环图游戏的SG值。定义 \(\operatorname{mex}\) 运算为最小的未出现的非负整数,状态 \(x\) 的SG值为 \(\operatorname{mex}\{\operatorname{SG}(y)|x \to y\}\)。
取石子游戏
有一堆石子,每次可以取 \(1\) 个、\(2\) 个或 \(3\) 个。通过计算SG值发现,\(\operatorname{SG}(n) = n \bmod 4\),所以 \(n \bmod 4 \neq 0\) 时先手必胜。
巴什博弈
有一堆 \(n\) 个石子,每次最多取 \(m\) 个。先手必胜当且仅当 \(n \bmod (m+1) \neq 0\)。
威佐夫博弈
有两堆石子,每次可以取一堆中的任意个,或者从两堆中取相同数量的石子。先手必败当且仅当 \((a,b)\) 是奇异局势,其中 \(a_k = \lfloor k \times \varphi \rfloor\), \(b_k = a_k + k\), \(\varphi = (1+\sqrt{5})/2\)。
八、计算几何
8.1 基本运算
向量运算
向量的点积、叉积、长度、距离、旋转等基本运算。点积用于判断角度,叉积用于判断方向和面积。
几何判断
判断三点是否共线、点是否在线段上、两线段是否相交、多边形面积、点是否在多边形内等。
8.2 凸包
凸包算法(Andrew算法)
求点集的凸包。按坐标排序后,分别求上下凸壳,使用叉积判断是否向左转。
旋转卡壳求凸包直径
求凸包上最远点对。使用一对平行线"卡住"凸包,旋转求最大距离。
8.3 旋转卡壳
求凸包最小面积外接矩形
使用旋转卡壳,维护四个方向的极值点,旋转过程中计算矩形面积的最小值。
总结
本文详细介绍了OI中常见的数论与数学问题的分类和理论,涵盖了基础数论、同余方程、数论函数、组合数学、线性代数、多项式、博弈论和计算几何等多个领域。每个部分都介绍了基本概念、重要定理和典型算法。
学习建议:
- 掌握基础算法和数据结构
- 理解数学原理和推导过程
- 多刷题练习,提高代码实现能力
- 学会分析问题,选择合适的算法
- 注意边界条件和特殊情况处理
希望这份资料对你在OI竞赛中的数论和数学问题学习有所帮助!

浙公网安备 33010602011771号