首页 > 其他分享 >快速 GCD

快速 GCD

时间:2024-07-25 17:17:28浏览次数:10  
标签:le GCD int dfrac sqrt gt 快速 预处理

预处理 GCD

\(O(n)\) 预处理,\(O(1)\) 查询两个小于 \(n\) 的数的快速 \(\gcd\)。

引理

对于任意正整数 \(n\),可以将 \(n\) 写成 \(n=abc\),满足 \(a,b,c\) 任意一个小于 \(\sqrt{n}\) 或为质数。

考虑归纳,首先对于 \(1\),显然成立。

否则,设 \(n\) 的最小质因子为 \(p\),设 \(\dfrac{n}{p}=xyz\) 是一个合法表示,不妨设 \(x\le y\le z\)。若 \(x=1\),则 \(n=pyz\) 是一个合法表示。不然有 \(p\le x\le y\le z\),则 \(p^4\le n\)。若 \(xp\gt\sqrt{n}\),有 \(yp\gt\sqrt{n},zp\gt\sqrt{n}\),则 \(xyzp^3\gt n^{3/2}\),矛盾,因此 \(n=(xp)yz\) 是合法表示。

注意这个证明给出了合法表示的构造方法。

预处理

  • 预处理所有 \((i,j)\),其中 \(i,j\le \sqrt{n}\) 的 \(\gcd\)。显然可以 \(O(n)\) 推出来。
  • 预处理 \(n\) 以内质数。

查询

计算 \(\gcd(x,y)\)。

设 \(x=abc\),则

\[(x,y)=(a,y)\times\left(b,\dfrac{y}{(a,y)}\right)\times\left(c,\dfrac{y}{(ab,y)}\right) \]

若 \(a\in\mathbf{P}\),只需判断 \(a\) 是否整除 \(y\),否则 \((a,y)=(y\bmod a,a)\),因为 \(a\le\sqrt{n}\),可以查表。

更相减损术

小常数 \(O(\log n)\)。

  • 若 \(a=b\),\((a,b)=a=b\)
  • 若 \(2\mid a,2\mid b\),\((a,b)=\left(\dfrac{a}{2},\dfrac{b}{2}\right)\)。
  • 若 \(2\mid a,2\nmid b\)(反之同理),\((a,b)=\left(\dfrac{a}{2},b\right)\)。
  • 若以上均不满足,设 \(a>b\),则 \((a,b)=(a-b,b)\)。
点击查看代码
int gcd(int a, int b) {
  int i = __builtin_ctz(a);
  int j = __builtin_ctz(b);
  int k = min(i, j);
  int d;
  b >>= j;
  while (a) {
    a >>= i;
    d = b - a;
    i = __builtin_ctz(d);
    if (a < b) b = a;
    if (d < 0) a = -d;
    else a = d;
  }
  return b << k;
}

标签:le,GCD,int,dfrac,sqrt,gt,快速,预处理
From: https://www.cnblogs.com/weily09/p/18323713

相关文章

  • 使用 IntelliJ IDEA 脚手架快速搭建 Spring Boot 项目
    使用IntelliJIDEA脚手架快速搭建SpringBoot项目大家好!今天我们来聊聊如何使用IntelliJIDEA脚手架快速搭建一个SpringBoot项目。SpringBoot是一个非常流行的Java框架,它简化了Spring应用的开发过程。而IntelliJIDEA则是一个功能强大的IDE,能够大大提高我们的......
  • Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)
    湖仓一体(DataLakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中,ApacheDoris持续加深与数据湖的融合,已演进出一套成熟的湖仓一体解决方案。为便于用户快速入门,我们将通过系列文......
  • 重磅 - Github 上免费大屏来啦,教你快速搭建积木报表
    先看看大屏效果JimuReport积木报表的集成版本,已经提供了免费数据可视化设计工具。支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表和门户设计;目前支持多种图表类型:柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等等;搭建步骤......
  • 【数论】1 矩阵快速幂(斐波那契)
    Tips:本篇blog适合刚开始学习数论部分的同学本题解仅代表个人思路,如有异议欢迎批评指正,谢谢一.概述该章节讲述的是矩阵运算及快速幂的概念,学过的同学可以跳过本章,直接看矩阵快速幂1.矩阵矩阵类似于向量,我们可以这么来表示一个矩阵如上图,表示了一个  的矩阵。矩阵也......
  • 连锁餐饮店如何快速实现低成本联网
    随着大众消费观念的转变、经济下行等诸多原因,消费降级让消费市场呈现低迷现状,尤其是餐饮行业,今年亏本经营甚至歇业闭店的门店数不胜数。为了应对营收降低的现状,提高门店持续经营的竞争力,降成本将是每个商家都关注的重点之一。网络作为餐饮店运营的重要基础设施,降低网络成本可作......
  • DRF入门规范,API接口,接口测试工具,restful规范,序列化和反序列化,drf安装和快速使用
    ⅠDRF入门规范【一】Web应用模式在开发Web应用中,有两种应用模式:【1】前后端不分离【2】前后端分离【3】前后端开发模式#1前后端混合开发-不少公司在用-flask混合-django混合-例如最简单的bbs项目-模板:dtl语法:djangotemplatelanguage模板语......
  • 文档翻译成中文会麻烦吗?简单操作,快速获取翻译
    每当你工作的时候,看到一堆来自海外文档时,你的脑海中可能会出现大大的两个字:无语。跨国企业的合同、国际合作的项目报告、外国邮件等,不同语言间的沟通往往会让工作变得困难。如何快速高效地处理这些文档?让自己的工作变得轻松点?翻译文档工具,相信可以在这个时候帮上你的忙。它翻......
  • 本地快速私有化部署和运行大语言模型
    ollama是一个快速部署和运行大语言模型的开源工具,https://ollama.com/。通过它可以在终端与大语言模型交互,而且安装非常的简单,支持非常多的模型,并且可以随意切换模型,支持模型地址:https://ollama.com/library如果你想使用LLM模型但是又不想暴露你的私人数据到公网,不放试......
  • SPI协议——结合百问网STM32入门 STM32 HAL快速入门与项目实战视频
    目录1、SPI协议的概念2、SPI的传输模式2.1SPI工作模式2.2SPI传输模式2.3SPI操作方法3、时序图4、代码实现4.1SPIHAL库编程4.2中断方式4.3DMA方式函数说明5、总结5.1SPI协议的优点5.2SPI协议的缺点1、SPI协议的概念SPI(SerialPeripheralInterface,......
  • Android Studio查看SQLite数据库(快速方便)
    在AndroidStudio不要使用databasenavigator/DBNavigator/DBBrowser插件查看SQLite数据库,因为AndroidStudio自带的Appinspection工具可以快捷的查看当前项目的SQLite数据库。使用教程找到Appinspection位置1,就在左下角的工具栏位置2,右键左边偏上的工具栏的moret......