1. 数论算法基础与应用实战
数论作为计算机科学的重要数学基础,在算法竞赛和实际开发中有着广泛应用。本文将深入解析七大核心数论算法:欧拉筛、快速幂、裴蜀定理、拓展欧几里得算法、同余方程、乘法逆元和Lucas定理,通过典型例题展示其实现原理与优化技巧。
提示:本文所有代码示例均采用C++实现,读者可根据实际需求调整语言版本。建议在阅读时同步运行代码示例,观察不同参数下的输出变化。
1.1 欧拉筛:高效素数筛法
欧拉筛(线性筛)是生成素数表的最优算法,时间复杂度O(n),空间复杂度O(n)。其核心思想是让每个合数只被其最小质因数筛除,避免重复计算。
1.1.1 算法实现与优化
cpp复制const int MAX=1e8+5;
int primes[MAX]; // 存储素数
bool vis[MAX]; // 标记是否为合数
int n,q,tot; // tot记录素数个数
void euler_sieve(int n) {
for(int i=2; i<=n; ++i) {
if(!vis[i]) primes[++tot] = i; // 未被标记则为素数
for(int j=1; j<=tot && i*primes[j]<=n; ++j) {
vis[i*primes[j]] = true; // 标记合数
if(i % primes[j] == 0) break; // 关键优化:保证只被最小质因数筛除
}
}
}
关键点解析:
if(i%primes[j]==0) break确保每个合数仅被筛一次- 内层循环条件
i*primes[j]<=n控制筛除范围 - 使用
ios::sync_with_stdio(false)加速IO,处理大规模数据时至关重要
1.1.2 性能对比
| 筛法类型 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|
| 暴力枚举 | O(n√n) | O(1) | 单次判断 |
