当前位置: 首页 > news >正文

gcd/lcm + 素数判断与筛法

一、最大公约数 gcd

1. 定义与性质

最大公约数gcd(a,b),是两个数公共约数中最大的一个。常用性质:

  • gcd(a, 0) = a
  • gcd(a, b) = gcd(b, a mod b)
  • 多个数的 gcd 可递推:gcd(a,b,c) = gcd(gcd(a,b), c)

2. 欧几里得算法(辗转相除法)

原理:利用gcd(a,b) = gcd(b, a mod b)不断缩小问题规模,直到余数为 0,此时除数即为答案。

int gcd(int a, int b) { while (b != 0) { int temp = a % b; a = b; b = temp; } return a; }

递归版

int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }

二、最小公倍数 lcm

公式与防溢出写法

由唯一分解定理可得:

lcm(a,b)=gcd(a,b)a×b​

直接a*b容易溢出 int,因此改为:

lcm(a,b)=a/gcd(a,b)∗b

int lcm(int a, int b) { return a / gcd(a, b) * b; }

三、埃拉托斯特尼筛法(埃氏筛)

用于批量预处理 1~n 内所有素数,时间复杂度O(n log log n)

  1. 初始假设所有数都是素数
  2. 从 2 开始,将每个素数的所有倍数标记为合数
  3. 最终未被标记的即为素数
const int MAXN = 1e6 + 5; bool is_prime[MAXN]; void sieve(int n) { for (int i = 0; i <= n; ++i) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { for (int j = i * i; j <= n; j += i) is_prime[j] = false; } } }

四、欧拉筛(线性筛)

埃氏筛会重复标记合数,欧拉筛保证每个合数只被最小质因子筛一次,达到严格线性复杂度O(n),是大规模筛素数的最优写法。

const int MAXN = 1e6 + 5; bool is_prime[MAXN]; int prime[MAXN], cnt; void euler_sieve(int n) { for (int i = 2; i <= n; ++i) { if (!is_prime[i]) prime[cnt++] = i; for (int j = 0; j < cnt && i * prime[j] <= n; ++j) { is_prime[i * prime[j]] = true; if (i % prime[j] == 0) break; } } }

注意事项

  1. gcd/lcm

    • 常用于分数约分、最简式、同余问题
    • 大数务必开long long避免溢出
  2. 筛法选择

    • 数据范围n ≤ 1e7:埃氏筛足够
    • n ≥ 1e7或需要最小质因子信息:优先欧拉筛
http://www.jsqmd.com/news/642939/

相关文章:

  • 第9章 函数-9.7 函数嵌套
  • AndroRAT客户端架构揭秘:Java实现远程控制的终极指南
  • PyTorch梯度累积实战:突破显存限制的Batch Size优化技巧
  • Vivado里那个AXI协议转换器IP核到底怎么用?手把手教你连接Zynq PS和旧版AXI3外设
  • Unity编辑器界面美化实战:GUISkin与GUIStyle的灵活配置与动态应用
  • SRE薪资报告:需求年增长25%,但初级岗位正在消失
  • 为什么92%的多模态API接口未启用模态级访问控制?——从Stable Diffusion API到Qwen-Audio服务的5个致命配置疏漏
  • 台式机背后的硬开关:为什么设计师把它藏起来?
  • 如何使用Chumsky构建高性能JSON解析器:从零到一的完整指南
  • YOLOv11的随机过程采样:泊松点过程(PPP)数据增强-(用空间随机场理论生成合成样本)
  • 【Flink】从零构建流处理应用:开发环境配置与WordCount实战解析
  • 访问管理化技术身份验证与单点登录实现
  • 保姆级教程:在Colab上快速部署CoTracker,5分钟搞定你的第一个视频点跟踪Demo
  • sw-precache终极指南:如何实现智能缓存清除与更新策略
  • 从谷歌论文到手机相册:深度拆解HDR+爆照技术如何拯救你的夜景照片
  • Github git clone 和 git push 特别慢的解决办法
  • Stripe 支付全攻略:SpringBoot 实战沙盒集成与 Webhook 深度解析
  • PointNet代码深度检测:10个潜在Bug与性能瓶颈排查终极指南
  • AI时代测试工程师的品牌建设指南
  • 正则表达式匹配
  • 华为OD机试 - 统计员工影响力分数(Python/JS/C/C++ 新系统 200分)
  • Photon Bridge 与 PHIX 合作开发 AI 数据中心激光光源
  • 终极性能提升秘籍:tiny-cuda-nn的JIT融合技术深度剖析
  • 终极指南:如何使用gumbo-parser构建高效HTML5解析工具
  • FastAdmin省市区联动选择:三种实现方案与实战解析
  • NestJs CRUD Swagger文档自动生成:终极API文档化指南
  • 告别PDF乱码!MinerU镜像一键转换多栏文档为Markdown
  • Java 云原生开发实践指南:构建现代化云应用
  • AI Agent入门指南:轻松掌握智能体核心技术,收藏学习必备!
  • 如何用wangEditor 5和mammoth.js实现Word文档一键转HTML(附完整代码)