青训营X豆包MarsCode 技术训练营第三课 | 豆包MarsCode AI 刷题
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例1:
输入:
n = 3 ,k = 1
输出:6
样例2:
输入:
n = 2 ,k = 2
输出:6
样例3:
输入:
n = 4 ,k = 3
输出:30我们需要构造一个包含 nn 个元素的数组,且满足以下条件:
- 所有元素两两不同。
- 数组所有元素的最大公约数为 kk。
- 数组元素之和尽可能小。
分析
- 元素的最大公约数为 kk:这意味着数组中的每个元素必须是 kk 的倍数。例如,如果 k=3k=3,那么数组的每个元素都必须是 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 (
n = 3, k = 1):- 选取数列 1,2,31,2,3,它们的和为 1+2+3=61+2+3=6,符合条件。
-
样例 2 (
n = 2, k = 2):- 选取数列 2,42,4,它们的和为 2+4=62+4=6,符合条件。
-
样例 3 (
n = 4, k = 3):- 选取数列 3,6,9,123,6,9,12,它们的和为 3+6+9+12=303+6+9+12=30,符合条件。
结论
该算法通过选择最小的 kk 的倍数来确保最大公约数为 kk,且元素两两不同,同时保证了最小的元素和。