公约数(acwing每日一题)

题目描述:

给定两个正整数 a 和 b。

你需要回答 q个询问。

每个询问给定两个整数 l,r,你需要找到最大的整数 x,满足:

  1. x 是 a 和 b的公约数。
  2. l≤x≤r。

输入格式:

第一行包含两个整数 a,b。

第二行包含一个整数 q。

接下来 q 行,每行包含两个整数 l,r。

输出格式:

每个询问输出一行答案,即满足条件的最大的 x,如果询问无解,则输出 −1。

数据范围:

前六个测试点满足 1≤a,b≤100,1≤q≤20。
所有测试点满足 1≤a,b≤1e9,1≤q≤1e4,1≤l≤r≤1e9。

输入样例:

9 27
3
1 5
10 11
9 11

输出样例:

3
-1
9

分析步骤:

  第一:首先,拿到题目我们就知道我们要求的是公约数,所以我们就得明确我们这道题目一定是要用到辗转相除法试除法求约数的!这是本题的第一个特点

  第二:其次,如果你能够知道我们这道题目的范围内一个数最多只有一千多个约数的话你就可以直接运用暴力求解,也能在规定时间解出这道题目这是本题的第二个特点

  第三:然后,我们还可以看到我们是要在一个区间之中求出一个最大的约数,如果我们把一个数的所有约数都求出来,在排个序那么他们将单调,所以我们可以在这个约数区间里找到一个数,看看是否在给定的询问区间之中,如果在则更新左区间,不在则更新右区间直到我们找到那个最大的数,至此我们分析出了单调找到一个点可以将一个区间分为满足和不满足和最值三个部分所以二分的思想就出来了,这是本体的第三个特点

  第四:书写主函数,构建整体框架:

  • 输入值,并且运用试除法将在这个区间的公约数都给求出来

  • 输入值,进入循环,输入给定的左右两区间。

  • 在定义我们的左右两区间,左边界定义为0,因为约数区间第一个数是从0开始的右边界定义为cnt-1,因为最后一个数下标是cnt-1。这里一定要明白我们这个二分区间,是二分的哪里的区间我们是要二分求出来的那些公约数的区间,因为我们要首先满足第一个条件,x 是 a 和 b的公约数看看哪个公约数满足我们的第二个条件,l≤x≤r。

  • 求出mid的值,如果这个值比给定的右边界更小的话就更新一下自己的左边界,因为如果这个数是满足条件的话,那么比它小的数即使也是公约数,但他不是最大的,所以左边的区间已经没有用了,应该在右边找。如果这个值比给定的右边界更大的话那么我们这个数的约数区间的右边一定比这个数还要大,那么这个数都不可能了,比这个数更大的话就越不可能了。所以更新右区间。

  • 找完一轮后,如果最终的这个值比给定的左边界大于等于的话就是答案,反之则不可能有这个数就输出-1。 

int main()
{int a, b;scanf("%d%d", &a, &b);init_divisors(a, b);int n;scanf("%d", &n);while (n -- ){int L, R;scanf("%d%d", &L, &R);int l = 0, r = cnt - 1;while (l < r){int mid = l + r + 1 >> 1;if (q[mid] <= R) l = mid;else r = mid - 1;}if (q[r] >= L) printf("%d\n", q[r]);else puts("-1");}return 0;
}

  第五:书写试除法函数:

  • 这里我们想一下公约数是不是有一个最大的公约数,所有的公约数都只能小于或等于这个公约数并且这些公约数都必须是最大公约数的约数,所以我们只要把最大的公约数求出来,再在最大公约数的范围之下求我们的遍历次数就会小很多。

  • 所以我们先利用辗转相除法求出最大的公约数。

  • 利用for循环,如果这个i是d的约数的话,就代表这个数也是约数,就把它放入我们的数组。

  • 如果这个数的另一半和自己不一样的话,那么也给它放入我们的约数数组

  • 最后一定要记得排序,二分查找一定是要二分有序的序列。

void init_divisors(int a, int b)
{int d = gcd(a, b);for (int i = 1; i <= d / i; i ++ )if (d % i == 0){q[cnt ++ ] = i;if (i != d / i) q[cnt ++ ] = d / i;}sort(q, q + cnt);
}

  第六:暴力求解:

int main()
{int a, b;scanf("%d%d", &a, &b);init_divisors(a, b);int n;scanf("%d", &n);while (n -- ){int L, R;scanf("%d%d", &L, &R);int l = 0, r = cnt - 1;while (l < r){int mid = l + r + 1 >> 1;if (q[mid] <= R) l = mid;else r = mid - 1;}if (q[r] >= L) printf("%d\n", q[r]);else puts("-1");}return 0;
}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1350;int q[N], cnt;int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}void init_divisors(int a, int b)
{int d = gcd(a, b);for (int i = 1; i <= d / i; i ++ )if (d % i == 0){q[cnt ++ ] = i;if (i != d / i) q[cnt ++ ] = d / i;}sort(q, q + cnt);
}int main()
{int a, b;scanf("%d%d", &a, &b);init_divisors(a, b);int n;scanf("%d", &n);while (n -- ){int L, R;scanf("%d%d", &L, &R);int l = 0, r = cnt - 1;while (l < r){int mid = l + r + 1 >> 1;if (q[mid] <= R) l = mid;else r = mid - 1;}if (q[r] >= L) printf("%d\n", q[r]);else puts("-1");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记&#xff08;十七&#xff09; 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解&#xff1a; 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计&#xff0c;找出最大长度&#xff0c;最后对找出的最长Y进…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

在Go语言中如何调试

调试是确定程序为何不像预期那样工作的过程。程序不像预期那样工作的迹象有很多,包括编译错误、运行阶段错误、文件权限错误以及数据不正确等。调试是程序员经常需要做的工作,而要理解Go语言,就必须明白它提供了哪些工具。使用Go语言开发复杂的程序时,调试将成为日常工作中…

POI、EasyExcel操作Excel表格详解

POI、EasyExcel 文章目录 POI、EasyExcel1.简介2.结构3.POI-Excel写1.基本操作2.大文件写入HSSF3.大文件写入XSSF4.大文件写入SXSSF 4.POI-Excel读1.基本操作2.数据类型3.计算公式类型数据读取 5.EasyExcel写1.基本写入操作2.日期、数字或者自定义格式转换3.列宽、行高 6.EasyE…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

【Linux】从零认识文件操作

送给大家一句话&#xff1a; 要相信&#xff0c;所有的不美好都是为了迎接美好&#xff0c;所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧&#xff01; 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头&#xff0c;旨在建立基于现有开源最佳实践的安全…

yolov8训练流程

训练代码 from ultralytics import YOLO# Load a model model YOLO(yolov8n.yaml) # build a new model from YAML model YOLO(yolov8n.pt) # load a pretrained model (recommended for training) model YOLO(yolov8n.yaml).load(yolov8n.pt) # build from YAML and tr…

巧用lambda表达式构建各种“树”

简述 利用jdk8 lambda表达式分组函数&#xff0c;可巧妙构建各种树&#xff0c;比如地区树&#xff0c;可以利用其多线程特性充分利用CPU提高性能。 分组函数&#xff1a;Collectors.groupingBy() 开起多线程&#xff1a;list.parallelStream() 实例 以地区为例&#xff1…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式&#xff0c;并生成了3X3的图像卷积模板&#xff0c;第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现&#xff0c;验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

Boost编译使用

Boost编译使用 文章目录 Boost编译使用写在前面测试环境 下载编译目录结构直接使用手动编译Boost.Build编译 参考 使用Vs中使用Qt中使用CMake中使用代码中使用 写在前面 Boost 是一个非常强大的 C 开源库,提供了许多高质量的、经过良好测试的 C 组件。 Boost 的主要特点包括广…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

佳能打印机E568扫描书和文件方法

官方网站; Canon : Inkjet 手册 : IJ Scan Utility : 启动IJ Scan Utility 打开打印机电源 扫描一个文件&#xff0c;翻页后盖好盖子。再点击扫描。 所有扫描结束之后点退出 点击保存

easyexcel-获取文件资源和导入导出excel

1、获取本地资源文件&#xff0c;根据模板填充数据导出 public void exportExcel(HttpServletResponse httpResponse, RequestBody AssayReportDayRecordQuery query) {AssayReportDayRecordDTO dto this.queryByDate(query);ExcelWriter excelWriter null;ExcelUtil.config…

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建 1、版本说明二、日志相关配置3、AOP 打印日志4、下载开源前端后台管理系统5、添加网关模块6、集成数据库和mp(1) 添加驱动和mp依赖(2) 数据库配置(3) 使用MybatisPlus 7、加密 yaml 文件中的内容(1) 依赖(2) 敏感…

SVG XML 格式定义图形入门介绍

SVG SVG means Scalable Vector Graphics. SVG 使用 XML 格式定义图形SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG 是万维网联盟的标准 Hello World Use SVG in html and you can see: Link to the SVG file You can use <a> tag to link to the svg…

02---webpack基础用法

01 entry打包的入口文件&#xff1a; 单入口entry是一个字符串:适用于单页面项目module.exports {entry:./src/index.js}多入口entry是一个对象module.exports {entry:{index:./src/index.js,app:./src/app.js}} 02 output打包的出口文件&#xff1a; 单入口配置module.ex…