📌  相关文章
📜  [L, R] 范围内的数字计数,只有 2 或 7 作为质因数(1)

📅  最后修改于: 2023-12-03 14:59:08.047000             🧑  作者: Mango

统计 [L, R] 范围内只由 2 和 7 两个质因数组成的数字数量

思路

首先,一个数字只有 2 和 7 两个质因数,等价于这个数字的质因数分解式只包含 2 和 7 两个质因数。

假设当前考虑的数字为 $n$,如果 $n$ 包含其它质因数,那么肯定无法满足条件,因此我们只需要考虑 $n$ 的质因数分解式是否只包含 2 和 7 两个质因数即可。

由于 $n$ 的最小质因数为 $p$,所以 $n$ 的任何因数都会包含 $p$,因此在枚举 $n$ 时,我们可以对 $p=2$ 和 $p=7$ 分别进行讨论:

  • 当 $p=2$ 时,我们将 $n$ 除以 2 并不断更新 $n$ 直至 $\frac{n}{2}$ 不再为偶数,这样能够保证 $n$ 的质因数分解式中只包含 2 和 7 两个质因数。
  • 当 $p=7$ 时,同理我们将 $n$ 除以 7 并不断更新 $n$ 直至 $\frac{n}{7}$ 不再为 7 的倍数,也能够保证 $n$ 的质因数分解式中只包含 2 和 7 两个质因数。

确定了 $n$ 的质因数分解式中只包含 2 和 7 两个质因数后,我们只需要判断 $n$ 是否在 [L, R] 范围内即可统计满足条件的数字数量。

代码实现
def count_numbers_with_only_2_and_7(L: int, R: int) -> int:
    """
    统计 [L, R] 范围内只由 2 和 7 两个质因数组成的数字数量
    """
    def count_num(n: int, p: int) -> int:
        res = 0
        while n % p == 0 and n >= L:
            n //= p
            res += 1
        return res

    count = 0
    for n in range(L, R + 1):
        cnt_2 = count_num(n, 2)
        cnt_7 = count_num(n, 7)
        if n == 1 or n == 2**cnt_2 * 7**cnt_7:
            count += 1

    return count

其中,count_num 函数用于统计 $n$ 的质因数分解式中质因数 $p$ 的指数,即 $n$ 中包含 $p$ 的因数个数。而在主函数中,我们枚举了 [L, R] 范围内的每一个数,并分别统计其中质因数 2 和 7 的个数,进而判断是否满足条件。最后返回满足条件的数字数量即可。