📌  相关文章
📜  [L,R]范围内的(2 ^ x * 3 ^ y)形式的整数计数(1)

📅  最后修改于: 2023-12-03 15:13:12.085000             🧑  作者: Mango

统计[L, R]范围内的(2 ^ x * 3 ^ y)形式的整数计数

在计算机科学中,经常需要对一定范围内的数字进行统计。本文介绍如何统计[L, R]范围内的(2 ^ x * 3 ^ y)形式的整数数量。

解题思路

首先,我们可以用两个循环枚举x和y,然后计算(2 ^ x * 3 ^ y)是否在[L, R]范围内。

但是,显然这种方法的时间复杂度为O((R - L + 1) * logR),当R很大时,会产生很大的性能问题。因此,我们需要更高效的方法来计算。

考虑到题目中的数字是形如(2 ^ x * 3 ^ y)的形式,我们可以将x和y都存储下来,然后对它们进行排序。这样做的好处是,我们可以用双指针的方法,对[L, R]范围内的数字进行统计。

具体来说,我们维护两个指针i和j,分别指向x和y的数组。然后,我们从L开始往后枚举每个数字,如果其等于(2 ^ x[i] * 3 ^ y[j]),则将计数器加1,并同时将i和j向后移动一位。如果小于(2 ^ x[i] * 3 ^ y[j]),则将i向后移动一位。如果大于(2 ^ x[i] * 3 ^ y[j]),则将j向后移动一位。直到i或j越界为止。

这种方法的时间复杂度为O((R - L) * logx * logy),其中logx和logy分别表示x和y数组的长度。注意到,由于x和y数组的长度最大为log R,因此总的时间复杂度为O((R - L) * (log R) ^ 2),可以通过本题的测试。

代码实现
def count_numbers(L: int, R: int) -> int:
    x, y = [], []
    for i in range(32):
        for j in range(20):
            if 2 ** i * 3 ** j >= L and 2 ** i * 3 ** j <= R:
                x.append(i)
                y.append(j)
    n = len(x)
    i = j = 0
    res = 0
    while i < n and j < n:
        if 2 ** x[i] * 3 ** y[j] >= L and 2 ** x[i] * 3 ** y[j] <= R:
            res += 1
            i += 1
            j += 1
        elif 2 ** x[i] * 3 ** y[j] < L:
            i += 1
        else:
            j += 1
    return res
总结

本文介绍了如何统计[L, R]范围内的(2 ^ x * 3 ^ y)形式的整数数量。首先,我们可以用两个循环枚举x和y,然后计算(2 ^ x * 3 ^ y)是否在[L, R]范围内。但是,这种方法的时间复杂度为O((R - L + 1) * logR),当R很大时,会产生很大的性能问题。因此,我们需要更高效的方法来计算,可以用双指针的方法,在O((R - L) * (log R) ^ 2)的时间内通过本题的测试。