Problem
A positive integer is magical if it is divisible by either a
or b
.
Given the three integers n
, a
, and b
, return the nth
magical number. Since the answer may be very large, return it modulo 109 + 7
.
Example 1:
1 | Input: n = 1, a = 2, b = 3 |
Example 2:
1 | Input: n = 4, a = 2, b = 3 |
Example 3:
1 | Input: n = 5, a = 2, b = 4 |
Example 4:
1 | Input: n = 3, a = 6, b = 4 |
Constraints:
1 <= n <= 109
2 <= a, b <= 4 * 104
Analysis
题目给了magic number的定义是能够整除a
或b
的数字,要求找出第N个。这类题目一般有两种解法,一种是利用程序的思想进行搜索,另一种是数学方法。从解题的角度,数学方法确实很难想到,这里我就分享程序的方法。
找第N个数字的问题不妨先放一边,先看给定一个x
,我们能知道它里面有多少个magic number。能够整除a
的数字个数是x / a
个,能够整除b
的数字个数是x / b
个,但是这中间有重复。比如x = 24, a = 3, b = 4
,其中12和24都是能够同时被3和4整除的,所以总的数量应该是x / a + x / b
还有减去重复的数量。重复的数量就是x
除以a
和b
的最小公倍数。所以总结一下,当我们知道x
后,它里面就有x / a + x / b + x / lcm(a, b)
个magic number,而它自己就是第N个数字了。
有了一个限制条件,题目也给出了x
的取值范围,在这两天提示下我们就要往二分答案上思考了。采用二分搜索,对于每一个mid
按照上面的公式计算出数量,如果大于N,则说明mid
选大了,需要去左半部分寻找;反之则到右半区间搜索。
Solution
无。
Code
1 | class Solution { |
Summary
这道题目是比较复杂的二分答案,主要难点在于如果构建出限制条件。需要分别计算出x / a
和x / b
,还要减去重复的部分。这道题目的分享到这里,感谢你的支持!