📜  查找给定范围内至少有 K 个连续复合整数的组(1)

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

题目描述

给定一个范围 [L, R] 和整数 K(0 < K <= R-L+1),要求找出该范围内至少有 K 个连续复合整数的所有组合。

其中,复合整数表示其除 1 和本身外,还可被其他正整数整除的数。例如,4 是一个复合整数,因为它除了 1 和本身外,还能被 2 整除。

思路

首先,我们需要确定如何判断一个数是否为复合整数。

对于给定的数 $n$,我们可以从 2 开始枚举其可能的因子。如果找到一个因子 $d$,使得 $d < n$ 且 $n$ 能被 $d$ 整除,则说明 $n$ 是一个复合整数。否则,说明 $n$ 是一个质数,不是复合整数。

判断出每个数是否为复合整数后,我们可以依次枚举区间内的所有位置为起始位置,然后再枚举其后面的位置,判断是否恰好存在 $K$ 个连续复合整数。如果是,记录下起始位置和结束位置,并统计符合要求的组合数。

代码实现
def is_composite(n):
    """判断n是否为复合整数"""
    for i in range(2, int(n**(1/2))+1):
        if n % i == 0:
            return True
    return False

def find_combinations(l, r, k):
    """查找范围 [l, r] 内至少有 k 个连续复合整数的所有组合"""
    combinations = []  # 符合要求的组合列表
    count = 0  # 记录找到的组合数

    for i in range(l, r-k+1):
        for j in range(i+k-1, r):
            if sum(is_composite(n) for n in range(i, j+1)) == k:
                count += 1
                combinations.append((i, j))

    return count, combinations
复杂度分析

对于范围内的每个数,需要进行一次因子枚举,因此时间复杂度为 $O((R-L+1) \sqrt{R})$。

对于每个起始位置,枚举至多 $R-L-K+2$ 个结束位置,对于每个组合需要判断该组合中的数是否为复合整数,因此时间复杂度为 $O((R-L-K+2)K \sqrt{R})$。

因此,总时间复杂度为 $O((R-L+1) \sqrt{R} + (R-L-K+2)K \sqrt{R})$。