目录

LC 878. 第 N 个神奇数字 (opens new window) (opens new window)

困难

# 问题描述

一个正整数如果能被 ab 整除,那么它是神奇的。

给定三个整数 n ,a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 109 + 7 取模 后的值。

示例 1:

输入:n = 1, a = 2, b = 3
输出:2

示例 2:

输入:n = 4, a = 2, b = 3
输出:6

提示:

  • 1 <= n <= 109
  • 2 <= a, b <= 4 * 104

# 二分查找

假设 f(x)f(x) 为小于等于 xx 的神奇数字的个数。

在区间 [0,x][0, x] 中,会有 xa\lfloor \frac{x}{a} \rfloor 个数能被 aa 整除,有 xb\lfloor \frac{x}{b} \rfloor 个数会被 bb 整除,某些数同时与 aabb 整除,整除个数为 xc\lfloor \frac{x}{c} \rfloor 个,ccaabb 的最小公倍数。

根据容斥原理可得 f(x)=xa+xbxcf(x) = \lfloor \frac{x}{a} \rfloor + \lfloor \frac{x}{b} \rfloor - \lfloor \frac{x}{c} \rfloor

显然 f(x)f(x) 是单调递增的,因此可以使用二分查找找到某个 xx 使得 f(x)=nf(x) = n

  • 时间复杂度:O(logn×min(a,b))O(\log{n \times min(a,b)})
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!