L8 - 高阶算法与数论专题
L8 - 高阶算法与数论专题
🎯 教学目标
- 掌握二分答案的复杂场景应用
- 建立递推思维解决组合数学问题
- 实现高效质数筛法优化算法性能
- 融合多知识点解决综合性难题
🔑 核心知识点
一、二分答案升级(复杂条件验证)
典型问题:最小化最大值问题
模板代码:
1 | double left=MIN, right=MAX; |
应用场景:
- 木棍切割最大长度
- 最小化机器人移动距离
二、递推与组合数学
1. 递推公式推导
1 | // 斐波那契数列 |
2. 组合数递推(杨辉三角)
1 | int C[10][10] = {0}; |
经典问题:
- 路径计数问题
- 多项式系数计算
三、实数二分算法(精度控制艺术)
1 | const double EPS = 1e-8; // 根据题目要求调整 |
典型应用:
- 计算方程近似解
- 几何图形交点求解
四、欧拉函数(计算互质数的个数)
定义:φ(n)表示1~n中与n互质的数的个数
计算公式:若n = p₁^a × p₂^b × …(p为质因子)
则 φ(n) = n × (1-1/p₁) × (1-1/p₂) × …
示例:
n = 6(质因子2,3)
φ(6) = 6 × (1-1/2) × (1-1/3) = 2
实际互质数:1,5
五、质数筛法(性能飞跃)
1. 埃拉托斯特尼筛法
1 | // 找出100以内的所有质数 |
2. 欧拉线性筛法(最优时间复杂度)
1 | vector<int> primes; // 存储最终找到的所有质数 |
筛法对比
算法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
埃氏筛 | O(n log n) | O(n) | 普通规模数据 |
欧拉筛 | O(n) | O(n) | 大规模数据 |
五、知识点综合应用
案例:质数间隔问题
1 | // 找出区间[L, R]内相邻质数差的最大值 |
📝 精选练习题
题目1:质数筛法应用
描述:输入两个数a,b(10 ≤ a < b ≤ 100),输出[a,b]区间内所有质数
样例输入:
1 | 20 30 |
样例输出:
1 | 23 29 |
题目2:欧拉函数计算
描述:输入正整数n(n ≤ 1000),输出φ(n)的值
样例输入:
1 | 8 |
样例输出:
1 | 4 // 与8互质的数:1,3,5,7 |
题目3:组合数递推验证
描述:输入n和k(1 ≤ k ≤ n ≤ 10),输出C(n,k)的值
样例输入:
1 | 5 2 |
样例输出:
1 | 10 |
题目4:实数二分(适合学有余力)
描述:计算√a的近似值(a>1),保留3位小数
输入:
1 | 2 |
输出:
1 | 1.414 |
解题提示:
- 设置二分范围left=1, right=a
- 循环直到right-left < 1e-4
- mid = (left+right)/2,比较mid²与a的大小
📚 学习建议
- 先掌握基础筛法:用埃氏筛法完成题目1
- 理解公式再编程:通过题目2理解欧拉函数的计算逻辑
- 画图辅助递推:用杨辉三角可视化题目3的递推过程
- 精度控制训练:题目4建议手算验证后再写代码
📝 学习路径导图
graph LR A[二分答案2] --> B[实数二分] A --> C[递推基础] C --> D[组合数递推] B --> E[质数筛法] D --> F[综合应用] E --> F
评论