问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
思路分析
-
最大公约数为 k:
- 首先,题目明确规定数组中所有元素的最大公约数是 k。这意味着数组中的所有元素必须是 k 的倍数。即数组中的元素应该是 k,2k,3k,4k,...。
-
元素两两不同:
- 题目中要求数组的元素是两两不同的,因此我们不能选重复的数字。例如,如果我们选择了 k,就不能再次选择 k,同理,选择 2k 后不能再选 2k。
-
元素之和尽可能小:
- 为了让元素的和尽可能小,我们应该选择最小的 n 个 k 的倍数。最小的 n 个数就是 k,2k,3k,…,nk,因为这是所有符合条件的数字中最小的。
-
求和公式:
- 数组的元素和就是这些最小的 n 个 k 的倍数的和: k+2k+3k+...+nk 我们可以将其提取出公因数 k,得到: k×(1+2+3+...+n)
- 1 到 nnn 的和是一个已知的公式: Sum=n×(n+1)/2
- 因此,最终的数组元素和为: k×n×(n+1)/2
解题步骤
-
理解问题的要求:
- 我们需要选择 n 个不同的数,这些数都是 k 的倍数,并且这些数的和要尽量小。
-
选择最小的 n 个 k 的倍数:
- 最小的 n 个 k 的倍数就是 k,2k,3k,…,nk这样可以保证它们的和最小。
-
计算和:
- 用公式 k×n×(n+1)/2 来计算最小元素和。
示例
样例 1
- 输入:
n = 3, k = 1 - 选择最小的 3 个数:1, 2, 3
- 它们的和是:1 + 2 + 3 = 6
- 输出:6
样例 2
- 输入:
n = 2, k = 2 - 选择最小的 2 个数:2, 4
- 它们的和是:2 + 4 = 6
- 输出:6
样例 3
- 输入:
n = 4, k = 3 - 选择最小的 4 个数:3, 6, 9, 12
- 它们的和是:3 + 6 + 9 + 12 = 30
- 输出:30
代码实现
def solution(n: int, k: int) -> int:
# 计算1到n的和
total_sum = n * (n + 1) // 2
# 最小元素和 = k * (1 + 2 + 3 + ... + n)
return k * total_sum
if __name__ == '__main__':
print(solution(n = 3, k = 1) == 6)
print(solution(n = 2, k = 2) == 6)
print(solution(n = 4, k = 3) == 30)
代码解读
在这段代码中:
- 我们首先计算了 1 + 2 + ... + n 的和,即使用了常见的公式: Sum=n×(n+1)/2
- 然后,将这个和乘以 k,得到了最小的元素和。
- 最终,返回计算结果。
知识总结
数学知识点
- 等差数列求和公式:题目中的 1+2+3+...+n 是一个简单的等差数列,它的和可以通过公式 Sum=n×(n+1)/2来计算,这是我们在求解过程中使用的一个重要公式。
- 最小公倍数和最大公约数:在处理最大公约数为 k 的问题时,我们知道数组的元素必须是 k 的倍数,而选取最小的 n 个倍数能够确保元素之和最小。
编程技巧
-
利用数学公式优化计算:通过等差数列求和公式,我们避免了循环累加的复杂度,直接得到结果,优化了性能。
-
理解问题的数学本质:面对这类问题时,首先要弄清楚数学上的规律和公式,尤其是常见的等差数列求和等知识。
-
提升自己的数学基础:解决这类问题时,掌握一些基本的数学公式和概念能帮助我们更快速地找到解决方案。
总之,通过这道题,我深刻体会到数学思维在编程中的重要性。掌握一些基本的数学公式可以让我们在解决问题时更加得心应手,提升编程效率。