5198.丑数III
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
能被a
或b
或者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相关推荐
- 三个数互质 java_LeetCode 5198. 丑数 III(Java)容斥原理和二分查找
请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...
- LeetCode 1201. 丑数 III(最小公倍数+二分查找)
1. 题目 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释: ...
- leetcode - 1201. 丑数 III
请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...
- LeetCode 313. 超级丑数(动态规划)
1. 题目 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7,13,1 ...
- LeetCode 263. 丑数 264. 丑数 II(DP)
文章目录 1. LeetCode 263. 丑数 解题 2. LeetCode 264. 丑数 II DP解题 1. LeetCode 263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只 ...
- 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 改造而来,所以效率会比 ...
- usaco ★Humble Numbers 丑数
★Humble Numbers 丑数 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于 S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p ...
- 剑指offer:丑数
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题思 ...
- 【剑指offer-Java版】34丑数
丑数:返回第N个丑数 只包含因子 2 3 5的数称为丑数,第一个丑数是 1 采用辅助数组的方法,提高时间效率 – 下一个丑数一定是已有的丑数乘以2 或者 3 或者 5 得到的 public class ...
最新文章
- java 关键字(面试题)
- BootStrap字体图标不显示、下拉菜单不显示
- 防Xss攻击,包含富文本编辑器的处理
- 5G URLLC — Overview
- 取得前九条之后的数据
- linux安装virtualbox命令,在Linux中从命令行查找Virtualbox Version的方法
- java用接口实例化对象_[求助]迷茫中,接口可以直接实例化对象吗?
- 计算机组成原理——机器字长、指令字长、存储字长
- 数据结构之串:基本概念
- Intellij IDEA 报错java.lang.NoClassDefFoundError
- 一体机扫描文档FTP搭建全程
- Chromium下载地址
- 电场强度 高斯定理 习题
- php如何做left,php函数substr实现asp中left和right应用
- 解决 java 程序中 CPU 占用率过高问题
- 环球企业家:web2.0创业时代将终结
- 三十岁,真的是人生的分水岭吗
- 面对一直在房价洼地的长沙,我不后悔十几年前逃离长沙
- 费马小定理(应用+拓展)
- 嵌入式开发工具集合及资料(转载)
热门文章
- pytorch---nn.moduleList 和Sequential
- Eclipse编译时函数报错:Undefined reference to 'pthread_create'
- sift算法c语言实现
- (01)OpenGL es中只在指定区域渲染view
- bootstrap table border粗细_Web前端开发(18)——Bootstrap响应式布局
- 为什么其他计算机连接需要密码是什么东西,连接其他电脑需要密码怎么处理
- python hash表_python数据结构与算法——哈希表
- public class c中_Spring中@Import的各种用法以及ImportAware接口
- fopen文件路径怎么写_php的多功能文件操作类
- 智慧城市java开发_智慧城市主界面开发 使用eclipse开发智慧城市APP源码 - 下载 - 搜珍网...