Time: 20190922
Type: Medium

题目描述

请你帮忙设计一个程序,用来找出第 n 个丑数。

丑数是可以被 a 或 b 或 c 整除的 正整数。

示例 1:

输入:n = 3, a = 2, b = 3, c = 5
输出:4
解释:丑数序列为 2, 3, 4, 5, 6, 8, 9, 10… 其中第 3 个是 4。
示例 2:

输入:n = 4, a = 2, b = 3, c = 4
输出:6
解释:丑数序列为 2, 3, 4, 6, 8, 9, 12… 其中第 4 个是 6。
示例 3:

输入:n = 5, a = 2, b = 11, c = 13
输出:10
解释:丑数序列为 2, 4, 6, 8, 10, 11, 12, 13… 其中第 5 个是 10。
示例 4:

输入:n = 1000000000, a = 2, b = 217983653, c = 336916467
输出:1999999984

提示:

1 <= n, a, b, c <= 10^9
1 <= a * b * c <= 10^18
本题结果在 [1, 2 * 10^9] 的范围内。

思路

这道题用到了奥数四大定理之一:容斥定理。

从1到n能被ab或者c整除的个数是:

被a整除的个数 + 被b整除的个数 + 被c整除的个数 - 能被a和b同时整除的个数 - 能被a和c同时整除的个数 - 能被b和c同时整除的个数 + 同时被a, b, c整除的个数。

因为计算个数就是个数学公式,我们就可以用二分法,从1到max(a, b, c) * n之间查找了。

代码

class Solution:def nthUglyNumber(self, n: int, a: int, b: int, c: int) -> int:# 最大公约数def gcd(a, b): if (a == 0): return b return gcd(b % a, a) # 最小公倍数def lcm(a, b): return ((a * b) // gcd(a, b)) # 从1到num,能被a或b或c整除的数的个数# 容斥定理# 奥数四大定理之一def divTermCount(a, b, c, num): # http://www.pianshen.com/article/8305144485/# num // a: 被a整除的个数# num // b: 被b整除的个数# num // c: 被c整除的个数# 减掉能被a和b同时整除的个数# 减掉能被a和c同时整除的个数# 减掉能被b和c同时整除的个数# 加上同时被a, b, c整除的个数return ((num // a) + (num // b) + (num // c) - (num // lcm(a, b)) - (num // lcm(b, c)) - (num // lcm(a, c)) + (num // lcm(a, lcm(b, c)))) # 二分搜索法def findNthTerm(a, b, c, n): low = 1high = max(a, b, c) * nmid = 0while (low < high): mid = low + (high - low) // 2if (divTermCount(a, b, c, mid) < n): low = mid + 1else: high = mid return low return findNthTerm(a,b,c,n)

2019.10 Update:

第一届PAT算法直播课培训班招募帖,欢迎点击查看详情、

END.

5198.丑数III相关推荐

  1. 三个数互质 java_LeetCode 5198. 丑数 III(Java)容斥原理和二分查找

    请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...

  2. LeetCode 1201. 丑数 III(最小公倍数+二分查找)

    1. 题目 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释: ...

  3. leetcode - 1201. 丑数 III

    请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...

  4. LeetCode 313. 超级丑数(动态规划)

    1. 题目 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7,13,1 ...

  5. LeetCode 263. 丑数 264. 丑数 II(DP)

    文章目录 1. LeetCode 263. 丑数 解题 2. LeetCode 264. 丑数 II DP解题 1. LeetCode 263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只 ...

  6. leetcode 263, 264, 1201, 313. Ugly Number I, II, III, Super Ugly Number(leetcode 丑数问题合集)

    263. Ugly Number https://leetcode.com/problems/ugly-number/ 本题题解由下面的 264. Ugly Number II 改造而来,所以效率会比 ...

  7. usaco ★Humble Numbers 丑数

    ★Humble Numbers 丑数 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于 S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p ...

  8. 剑指offer:丑数

    题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题思 ...

  9. 【剑指offer-Java版】34丑数

    丑数:返回第N个丑数 只包含因子 2 3 5的数称为丑数,第一个丑数是 1 采用辅助数组的方法,提高时间效率 – 下一个丑数一定是已有的丑数乘以2 或者 3 或者 5 得到的 public class ...

最新文章

  1. java 关键字(面试题)
  2. BootStrap字体图标不显示、下拉菜单不显示
  3. 防Xss攻击,包含富文本编辑器的处理
  4. 5G URLLC — Overview
  5. 取得前九条之后的数据
  6. linux安装virtualbox命令,在Linux中从命令行查找Virtualbox Version的方法
  7. java用接口实例化对象_[求助]迷茫中,接口可以直接实例化对象吗?
  8. 计算机组成原理——机器字长、指令字长、存储字长
  9. 数据结构之串:基本概念
  10. Intellij IDEA 报错java.lang.NoClassDefFoundError
  11. 一体机扫描文档FTP搭建全程
  12. Chromium下载地址
  13. 电场强度 高斯定理 习题
  14. php如何做left,php函数substr实现asp中left和right应用
  15. 解决 java 程序中 CPU 占用率过高问题
  16. 环球企业家:web2.0创业时代将终结
  17. 三十岁,真的是人生的分水岭吗
  18. 面对一直在房价洼地的长沙,我不后悔十几年前逃离长沙
  19. 费马小定理(应用+拓展)
  20. 嵌入式开发工具集合及资料(转载)

热门文章

  1. pytorch---nn.moduleList 和Sequential
  2. Eclipse编译时函数报错:Undefined reference to 'pthread_create'
  3. sift算法c语言实现
  4. (01)OpenGL es中只在指定区域渲染view
  5. bootstrap table border粗细_Web前端开发(18)——Bootstrap响应式布局
  6. 为什么其他计算机连接需要密码是什么东西,连接其他电脑需要密码怎么处理
  7. python hash表_python数据结构与算法——哈希表
  8. public class c中_Spring中@Import的各种用法以及ImportAware接口
  9. fopen文件路径怎么写_php的多功能文件操作类
  10. 智慧城市java开发_智慧城市主界面开发 使用eclipse开发智慧城市APP源码 - 下载 - 搜珍网...