问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
思考过程
根据题目要求,我们需要构造一个包含 nn 个元素的数组,具体的构造方法如下:
- 由于要求所有数组元素的最大公约数必须为 kk,因此我们可以推断出,数组中的每一个元素都应当是 kk 的倍数。这是确保它们的最大公约数满足条件的一种有效方式。
- 为了进一步满足题目中提出的元素和尽可能小的需求,我们可以选择从k开始的连续的k的倍数。这样做不仅简单明了,而且能有效地控制总和的大小。
- 由此可以构建出该数组的基本形式为:k,2k,3k,…,nk。这意味着我们将依次选取k的前n个倍数。
- 然而,为了确保数组中每个元素都是两两不同且符合要求,我们可以直接选择前n个k的倍数,这样可以较为简单和有效地实现题目的要求。
- 已知定义了
def solution(n: int, k: int) -> int:的函数。该函数将接受两个参数,分别为整数类型的 n 和 k,而其最终目标是返回一个整数。
代码实现
在代码的实现过程中,我们将遵循几个清晰的步骤,以确保正确性和高效性:
第一步: 初始化一个列表,用于存储计算出 kk 的倍数。这个列表能够有效地收集我们所需要的数值,代码如下所示:
multiples = []Copy
第二步: 从 kk 开始,生成 nn 个 kk 的倍数。我们将使用一个变量 current 来表示当前生成的倍数,其初始值设为 kk:
current = kCopy
这里,current 变量的作用是从 kk 开始递增,每次增加 kk,以确保接下来的生成过程中的数值始终保持为 kk 的倍数。
第三步: 使用 while 循环语句以保证生成出 nn 个 kk 的倍数。在每次迭代中,都会通过 current += k 来递增 current,直至成功生成 nn 个元素。该结构的基本形式为:
while condition: # 执行的代码块Copy
这里,while condition 表示只要 condition 条件为真,就会反复执行代码块中的内容,直到满足我们生成元素的需求。
第四步: 在完成所有倍数的生成之后,我们需要对这些倍数进行求和,以计算出它们的总和。我们将使用如下代码:
result = sum(multiples)Copy
这里,sum(multiples) 函数用于计算生成的倍数列表的总和,进而将结果存储到 result 变量中,方便后续返回或进行其他处理。
def solution(n: int, k: int) -> int:
multiples = []
current = k
while len(multiples) < n:
if current not in multiples:
multiples.append(current)
current += k
result = sum(multiples)
return result
if __name__ == '__main__':
print(solution(n = 3, k = 1) == 6)
print(solution(n = 2, k = 2) == 6)
print(solution(n = 4, k = 3) == 30)