878. 第 N 个神奇数字 数学+二分
878. 第 N 个神奇数字
一个正整数如果能被
a
或b
整除,那么它是神奇的。给定三个整数
n
,a
,b
,返回第n
个神奇的数字。因为答案可能很大,所以返回答案 对109 + 7
取模 后的值。示例 1:
输入:n = 1, a = 2, b = 3 输出:2示例 2:
输入:n = 4, a = 2, b = 3 输出:6提示:
1 <= n <= 10^9
2 <= a, b <= 4 * 10^4
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/nth-magical-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题结果
成功
方法:数学+二分
1. 求最大公约数
2. 每到达一次最大公约数,就是 从 a 到达的次数+从 b 到达次数 - lcm 次数
3. 那大概就在上一个公倍数,到下一个公倍数之间,比如 6,2,3 ,2和3最小公倍数是6,那每到达6就经过 3 个 2 的倍数 和 2 个 3 的倍数,其中 6 是公共的,减掉 1个,那每经过 6,就消耗掉 4 个数,所以可以确定,n=6 是经过了 1 个 最小公倍数周期,也就是 n/4*6=6,也就是大概在 6 到 12之间,可在这部分二分拿到答案。
class Solution {public int nthMagicalNumber(int n, int a, int b) {long lcm = lcm(a,b);long time = lcm/a+lcm/b-1;long left = n/time*lcm;long right = (n/time+1)*lcm;while(left<right){long mid = (right-left)/2+left;long cnt = mid/a+mid/b-mid/lcm;if(cnt<n){left = mid+1;}else{right = mid;}}return (int) (right%(long)(1e9+7));}private long lcm(long a, long b){long gcd = gcd(a,b);return a/gcd*b/gcd*gcd;}private long gcd(long a, long b){return b== 0?a:gcd(b,a%b);}
}
时间复杂度:O(log(max(a,b)))
空间复杂度:O(1)
其他,如果a,b 较小, n 足够大(中间计算超过long)的情况下,怎么处理呢?
可考虑记录一个周期,而非直接计算次数,前面的部分,可直接计算到公倍数求余的和,最后一部分可先缩减到第一个周期计算,然后再补充前面的余数再求余。
878. 第 N 个神奇数字 数学+二分相关推荐
- 878. 第 N 个神奇数字(二分查找+数学)| 1819. 序列中不同最大公约数的数目(枚举+数学)
878. 第 N 个神奇数字 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 ...
- LeetCode 878. 第 N 个神奇数字(二分查找)
文章目录 1. 题目 2. 解题 1. 题目 如果正整数可以被 A 或 B 整除,那么它是神奇的. 返回第 N 个神奇数字.由于答案可能非常大,返回它模 10^9 + 7 的结果. 示例 1: 输入: ...
- 力扣每日一题:878. 第 N 个神奇数字【二分法】
一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值. 示例 1: 输 ...
- 【LeetCode】878. 第 N 个神奇数字
题目描述 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值. 示例 ...
- 力扣算法题,第N个神奇数字(Python)
878.第N个神奇数字 题目描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + ...
- 【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学
第N个神奇数字[LC878] 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 ...
- LeetCode-878. 第 N 个神奇数字【数学,二分查找,找规律】
LeetCode-878. 第 N 个神奇数字[数学,二分查找,找规律] 题目描述: 解题思路一:二分答案+容斥原理.给定一个上下界,然后依次增大下界或者减小上界,直到只剩一个答案.容斥原理是,加上两 ...
- 数学计算机学具制作,神奇的数学
神奇的数学 神奇的数学1 好玩的数学, 加减乘除的运用, 就像奇妙的游戏, 带来无穷的乐趣, 数学真好玩. 奇妙的数学, 就像头脑一样, 知识永无止境, 有着魔力般的吸引力, 让人想成长. 千变万化的 ...
- 神奇的数学之回文数(不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数)
神奇的数学之回文数 Description 回文数是一种数字.如:8008, 这个数字正读是8008,倒读也是8008,正读倒读一样,所以这个数字就是回文数. 任取一个正整数,如果不是回文数,将该数与 ...
最新文章
- perl语言编程 第四版_2020年,5 种 将死的编程语言!
- I/O端口和I/O内存
- oracle开审计记录变动的表,Oracle未开启审计情况下追踪表变更记录
- 关于 Angular 应用 tsconfig.json 中的 target 属性
- 修改 jquery.validate.js 支持非form标签
- linux删除grid数据文件,MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除...
- Mysql 允许所有IP访问
- 蓝桥杯 2017 国赛B组C/C++【对局匹配】
- 后台拿webshell的常用方法总结
- mysql root dengru_Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)
- Servlet(Request.Response)+文件上传
- java 读取 properties 配置文件的几种方式
- 编译原理(第四版)胡元义第三章部分习题答案(2)
- Python学习笔记-数据分析-Pandas02-Dataframe
- 【文献调研】三相DLMP的motivation调研
- Windows CMD中的findstr命令详解
- 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
- Deep Learning for Single Image Super-Resolution: A Brief Review SISR综述分析
- php5217 0day,知道创宇:最新版DEDECMS存SQL注入0day漏洞
- 时间日期格式化(xxx之前)
热门文章
- 事件驱动模型与IO多路复用
- 求数列极差(贪心算法)
- MySQL8数据库原理与应用(微课版)课后笔记-实训7
- source insight最新版4.0.0124下载安装以及使用
- (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
- pat-1069 The Black Hole of Numbers (20分)
- 使用pyspark 的udf进行tensorflow 模型的预测报错 _pickle.PicklingError: Could not serialize object:
- C++ 使用new申请内存
- STM32F767--LTC4015--SMBUS通信
- 用Python分析许嵩的歌,带你追忆青春时的懵懂