青训营X豆包MarsCode 技术训练营第三课 | 豆包MarsCode AI 刷题

55 阅读2分钟

青训营X豆包MarsCode 技术训练营第三课 | 豆包MarsCode AI 刷题

小C希望构造一个包含n个元素的数组,且满足以下条件:

  1. 数组中的所有元素两两不同。
  2. 数组所有元素的最大公约数为 k
  3. 数组元素之和尽可能小。

任务是输出该数组元素之和的最小值。


测试样例

样例1:

输入:n = 3 ,k = 1
输出:6

样例2:

输入:n = 2 ,k = 2
输出:6

样例3:

输入:n = 4 ,k = 3
输出:30 我们需要构造一个包含 nn 个元素的数组,且满足以下条件:

  1. 所有元素两两不同
  2. 数组所有元素的最大公约数为 kk
  3. 数组元素之和尽可能小

分析

  1. 元素的最大公约数为 kk:这意味着数组中的每个元素必须是 kk 的倍数。例如,如果 k=3k=3,那么数组的每个元素都必须是 3 的倍数。
  2. 所有元素两两不同:数组中的每个元素必须是唯一的。
  3. 元素之和尽可能小:为了使元素之和最小,我们应选择最小的 kk 的倍数,但同时又要确保它们两两不同。

解法步骤

  • 对于每个 kk,我们可以选择最小的 kk 的倍数开始,如 k,2k,3k,…k,2k,3k,…。
  • 因为我们要选择 nn 个不同的数,我们从 kk 开始选择,选择的数应当依次为 k,2k,3k,…,nkk,2k,3k,…,nk。
  • 最后,所有选出的数的和就是我们想要的最小和。

结论

我们可以直接选择数列 k,2k,3k,…,nkk,2k,3k,…,nk,它们的最大公约数就是 kk,且元素两两不同。

数学推导

数列的和为:

S=k×(1+2+3+⋯+n)S=k×(1+2+3+⋯+n)

使用等差数列求和公式,1+2+⋯+n=n(n+1)21+2+⋯+n=2n(n+1)​,因此总和为:

S=k×n(n+1)2S=k×2n(n+1)​

代码实现

pythonCopy Code
def min_sum(n, k):
    # 计算数列的和
    return k * (n * (n + 1)) // 2

# 测试样例
print(min_sum(3, 1))  # 输出:6
print(min_sum(2, 2))  # 输出:6
print(min_sum(4, 3))  # 输出:30

解释

  1. 样例 1 (n = 3, k = 1):

    • 选取数列 1,2,31,2,3,它们的和为 1+2+3=61+2+3=6,符合条件。
  2. 样例 2 (n = 2, k = 2):

    • 选取数列 2,42,4,它们的和为 2+4=62+4=6,符合条件。
  3. 样例 3 (n = 4, k = 3):

    • 选取数列 3,6,9,123,6,9,12,它们的和为 3+6+9+12=303+6+9+12=30,符合条件。

结论

该算法通过选择最小的 kk 的倍数来确保最大公约数为 kk,且元素两两不同,同时保证了最小的元素和。