简单数论学习笔记

一、基础概念

1.1 质数(素数)

  • 定义:大于 1 的自然数中,除了 1 和它本身外不再有其他因数的数。
  • 判定原理:检查 2 到 \(\sqrt{x}\) 的所有整数是否能整除 \(x\)。若存在因子则非质数,否则为质数。因为若 \(x\) 有大于 \(\sqrt{x}\) 的因子,必然对应一个小于 \(\sqrt{x}\) 的因子。
  • 优化判定:除 2、3 外,所有质数均满足 \(n \bmod 6 = 1\)\(n \bmod 6 = 5\)。可先排除 2、3 及形如 \(6k\pm1\) 以外的数,再在 \(6k\pm1\) 的候选集中试除,减少循环次数。

1.2 埃氏筛(埃拉托斯特尼筛法)

  • 原理:从 2 开始,将每个质数的倍数标记为合数。遍历结束后,未被标记的数即为质数。
  • 时间复杂度\(O(n \log \log n)\)
  • 优化:从 \(i^2\) 开始标记,因为小于 \(i^2\) 的倍数已被更小的质数标记过。

1.3 线性筛(欧拉筛)

  • 原理:埃氏筛会重复标记同一个合数(如 6 被 2 和 3 各标记一次)。线性筛保证每个合数只被其最小质因子筛除一次,从而做到 \(O(n)\)
  • 核心机制:遍历 \(i\) 从 2 到 \(n\),若 \(i\) 未被标记则为质数,存入质数表。然后遍历质数表,将 \(i \times prime[j]\) 标记为合数,一旦 \(i \bmod prime[j] == 0\) 则跳出循环。该跳出条件确保了每个合数只被其最小质因子标记。

二、基础筛法题目讲解

P5736 【深基7.例2】质数筛

  • 题意:输入 \(n\) 个不超过 \(10^5\) 的正整数,输出其中的所有质数。
  • 思路:数据规模很小,可直接对每个数执行 \(O(\sqrt{x})\) 的质数判定;也可预先用埃氏筛或线性筛筛出 \(10^5\) 以内的质数表,然后 \(O(1)\) 查询。

P1865 A % B Problem

  • 题意:多次询问区间 \([l, r]\) 内的质数个数。若区间超出 \([1, m]\) 则输出 "Crossing the line"。
  • 思路:用线性筛预处理 \(1\sim m\) 的所有质数,同时维护前缀和数组 \(sum[i]\) 表示 \(1\sim i\) 中质数的个数。每次询问答案为 \(sum[r] - sum[l-1]\),边界判断即可。时间复杂度 \(O(m)\) 预处理,\(O(1)\) 查询。

三、线性素数筛模板题

P3383 【模板】线性筛素数

  • 题意:给定 \(n\)\(q\) 次询问,每次输出第 \(k\) 小的素数。
  • 数据范围\(n=10^8\)\(q \le 10^6\),必须使用 \(O(n)\) 的线性筛。筛出所有质数后直接下标访问输出。

P3912 素数个数

  • 题意:求 \(1\sim N\) 中素数的个数,\(N \le 10^8\)
  • 思路:可用埃氏筛或线性筛统计数量。若仅需数量,埃氏筛优化后可在 \(O(n \log\log n)\) 下通过,注意内存优化(使用 bitsetbool 数组)。

四、高精度加减乘除(数组 / 字符串模拟)

4.1 高精度加法

  • 原理:将两个大数以字符串读入,按位存入数组(个位在索引 0)。模拟竖式加法,从低位到高位逐位相加,记录进位。结果长度最多为 \(\max(len_a, len_b) + 1\),最后去除前导零。

4.2 高精度乘法

  • 原理:模拟乘法竖式。乘数 \(b\) 的第 \(j\) 位乘以被乘数 \(a\) 的第 \(i\) 位,结果累加到 \(res[i+j]\) 中。然后统一处理进位(每位保留个位,进位加到下一位)。结果长度为 \(len_a + len_b\),同样需去除前导零。

4.3 高精度除法(高精除以低精)

  • 原理:模拟长除法。从被除数的最高位开始,维护当前余数 \(t\)。每次将 \(t\) 乘以 10 加上当前位的数字,得到当前被除数,除以除数得到商位,余数更新为模结果。最后去除商的前导零。

注意:高精度除法通常只涉及高精度除以低精度(整数),若要处理高精度除以高精度,则需实现更复杂的逐位试商法。


五、快速幂与扩展欧几里得

5.1 快速幂(模意义)

  • 作用:在 \(O(\log b)\) 时间内计算 \(a^b \bmod p\)
  • 原理:将指数 \(b\) 拆分为二进制形式,若当前二进制位为 1,则将当前底数乘入答案;底数不断平方。全程取模防止溢出。

5.2 扩展欧几里得算法(exgcd)

  • 作用:求解方程 \(ax + by = \gcd(a, b)\) 的一组整数解 \((x, y)\)
  • 原理:利用欧几里得递归关系 \(\gcd(a,b)=\gcd(b,a\bmod b)\)。假设已求得 \(b x' + (a\bmod b) y' = \gcd\),则可反推出 \(a x + b y = \gcd\) 的解,递推关系为:
    \(x = y'\)\(y = x' - \lfloor a/b \rfloor \cdot y'\)

5.3 同余方程(P1082)

  • 题意:求 \(ax \equiv 1 \pmod b\) 的最小正整数解。
  • 思路:等价于 \(ax + by = 1\),用 exgcd 求出一组特解 \((x_0, y_0)\),则通解为 \(x = x_0 + k\cdot b\)。最小正整数解为 \((x_0 \bmod b + b) \bmod b\)

5.4 二元一次不定方程(P5656)

  • 题意:求解 \(ax + by = c\),输出正整数解的个数,以及 \(x\)\(y\) 的最小、最大值。
  • 思路
    1. 先求 \(\gcd(a,b)=g\),若 \(c \bmod g \ne 0\) 则无整数解。
    2. 用 exgcd 求 \(ax+by=g\) 的特解,然后乘以 \(c/g\) 得到原方程特解。
    3. 通解公式:\(x = x_0 + \frac{b}{g} \cdot t\)\(y = y_0 - \frac{a}{g} \cdot t\)
    4. 利用不等式 \(x \ge 1, y \ge 1\) 确定 \(t\) 的范围,进而计算解的个数以及 \(x_{\min}, x_{\max}, y_{\min}, y_{\max}\)

六、作业题思路提示

P3811 【模板】模意义下的乘法逆元

  • 题意:求 \(1\sim n\) 在模 \(p\)\(p\) 为质数)意义下的乘法逆元。
  • 思路:使用线性递推公式

    \[inv[i] = (p - \frac{p}{i}) \cdot inv[p \bmod i] \bmod p \]

    初始 \(inv[1] = 1\)。时间复杂度 \(O(n)\)

P2054 [AHOI2005] 洗牌

  • 题意:一次洗牌后位置 \(x\) 变为 \(2x \bmod (n+1)\)。经过 \(m\) 次洗牌,求原来第 \(L\) 张牌现在的位置。
  • 思路:原位置 \(x\) 经过 \(m\) 次后变为 \(x \cdot 2^m \bmod (n+1)\)。要求解 \(x \cdot 2^m \equiv L \pmod{n+1}\),即 \(x \equiv L \cdot (2^m)^{-1} \pmod{n+1}\),使用快速幂求逆元。

P5091 【模板】扩展欧拉定理

  • 题意:给定 \(a, b, m\),其中 \(b\) 极大(可达 \(10^{20000000}\)),求 \(a^b \bmod m\)
  • 思路:利用扩展欧拉定理:
    \(b \ge \varphi(m)\),则 \(a^b \equiv a^{b \bmod \varphi(m) + \varphi(m)} \pmod m\)
    先求 \(\varphi(m)\),再读入大数 \(b\) 并边读边取模,同时判断是否超过 \(\varphi(m)\),最终用快速幂计算。

P4139 上帝与集合的正确用法

  • 题意:求无穷幂塔 \(2^{2^{2^{\cdots}}} \bmod p\)
  • 思路:定义函数 \(f(p)\),利用扩展欧拉定理递归:

    \[f(p) = \begin{cases} 0 & p=1 \\ 2^{f(\varphi(p)) + \varphi(p)} \bmod p & p>1 \end{cases} \]

    因为指数部分必然大于 \(\varphi(p)\),所以直接加 \(\varphi(p)\)。递归求解即可。

P2303 [SDOI2011] 计算器

  • 题意:三合一题目,包含三种操作:
    1. 计算 \(y^z \bmod p\)(快速幂)。
    2. \(xy \equiv z \pmod p\)(线性同余方程,用 exgcd)。
    3. \(y^x \equiv z \pmod p\)(离散对数,用 BSGS 算法)。
  • 思路:分别实现三个子程序,根据输入类型调用。

P1516 青蛙的约会

  • 题意:两只青蛙在长度为 \(L\) 的环上跳,初始位置 \(x, y\),每次分别跳 \(m, n\) 米,求相遇所需最少步数。
  • 建模:相遇条件为 \((x + m t) \equiv (y + n t) \pmod L\),即 \((m-n)t \equiv y-x \pmod L\)。令 \(a = m-n\)\(b = L\)\(c = y-x\),解线性同余方程 \(a t \equiv c \pmod b\)。若 \(\gcd(a,b) \nmid c\) 则无解,否则用 exgcd 求最小非负整数解。

posted @ 2026-07-03 15:55  spring_sun  阅读(29)  评论(0)    收藏  举报