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 个神奇数字 数学+二分相关推荐

  1. 878. 第 N 个神奇数字(二分查找+数学)| 1819. 序列中不同最大公约数的数目(枚举+数学)

    878. 第 N 个神奇数字 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7  ...

  2. LeetCode 878. 第 N 个神奇数字(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 如果正整数可以被 A 或 B 整除,那么它是神奇的. 返回第 N 个神奇数字.由于答案可能非常大,返回它模 10^9 + 7 的结果. 示例 1: 输入: ...

  3. 力扣每日一题:878. 第 N 个神奇数字【二分法】

    一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值. 示例 1: 输 ...

  4. 【LeetCode】878. 第 N 个神奇数字

    题目描述 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值. 示例 ...

  5. 力扣算法题,第N个神奇数字(Python)

    878.第N个神奇数字 题目描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + ...

  6. 【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学

    第N个神奇数字[LC878] 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 ...

  7. LeetCode-878. 第 N 个神奇数字【数学,二分查找,找规律】

    LeetCode-878. 第 N 个神奇数字[数学,二分查找,找规律] 题目描述: 解题思路一:二分答案+容斥原理.给定一个上下界,然后依次增大下界或者减小上界,直到只剩一个答案.容斥原理是,加上两 ...

  8. 数学计算机学具制作,神奇的数学

    神奇的数学 神奇的数学1 好玩的数学, 加减乘除的运用, 就像奇妙的游戏, 带来无穷的乐趣, 数学真好玩. 奇妙的数学, 就像头脑一样, 知识永无止境, 有着魔力般的吸引力, 让人想成长. 千变万化的 ...

  9. 神奇的数学之回文数(不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数)

    神奇的数学之回文数 Description 回文数是一种数字.如:8008, 这个数字正读是8008,倒读也是8008,正读倒读一样,所以这个数字就是回文数. 任取一个正整数,如果不是回文数,将该数与 ...

最新文章

  1. perl语言编程 第四版_2020年,5 种 将死的编程语言!
  2. I/O端口和I/O内存
  3. oracle开审计记录变动的表,Oracle未开启审计情况下追踪表变更记录
  4. 关于 Angular 应用 tsconfig.json 中的 target 属性
  5. 修改 jquery.validate.js 支持非form标签
  6. linux删除grid数据文件,MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除...
  7. Mysql 允许所有IP访问
  8. 蓝桥杯 2017 国赛B组C/C++【对局匹配】
  9. 后台拿webshell的常用方法总结
  10. mysql root dengru_Mysql学习Mysql中文汉字转拼音的实现(每个汉字转换全拼)
  11. Servlet(Request.Response)+文件上传
  12. java 读取 properties 配置文件的几种方式
  13. 编译原理(第四版)胡元义第三章部分习题答案(2)
  14. Python学习笔记-数据分析-Pandas02-Dataframe
  15. 【文献调研】三相DLMP的motivation调研
  16. Windows CMD中的findstr命令详解
  17. 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
  18. Deep Learning for Single Image Super-Resolution: A Brief Review SISR综述分析
  19. php5217 0day,知道创宇:最新版DEDECMS存SQL注入0day漏洞
  20. 时间日期格式化(xxx之前)

热门文章

  1. 事件驱动模型与IO多路复用
  2. 求数列极差(贪心算法)
  3. MySQL8数据库原理与应用(微课版)课后笔记-实训7
  4. source insight最新版4.0.0124下载安装以及使用
  5. (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  6. pat-1069 The Black Hole of Numbers (20分)
  7. 使用pyspark 的udf进行tensorflow 模型的预测报错 _pickle.PicklingError: Could not serialize object:
  8. C++ 使用new申请内存
  9. STM32F767--LTC4015--SMBUS通信
  10. 用Python分析许嵩的歌,带你追忆青春时的懵懂