小C希望构造一个包含n个元素的数组,使得:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数(GCD)为 k。
- 数组元素之和尽可能小。
任务是要输出该数组元素之和的最小值。
思路分析
1. 数组元素两两不同
- 这意味着数组中的每个元素必须是不同的整数。
2. 数组元素的最大公约数为 k
- 这意味着我们需要找到一个包含n个元素的数组,使得它们的最大公约数是 k。我们可以通过让数组中的每个元素都等于 k 的倍数来满足这一条件。
- 更具体地说,如果我们选择数组的元素为
k * a1, k * a2, ..., k * an,其中a1, a2, ..., an是 n 个互不相同的整数,且它们的最大公约数为 1,那么数组的最大公约数就等于 k。
3. 数组元素之和尽可能小
- 为了使数组的元素和尽可能小,我们应当尽量选择最小的不同整数 a1, a2, ..., an,使得这些整数的最大公约数为 1。最小的这类整数是 1, 2, 3, ..., n。
- 因此,我们可以选择数组中的元素为:
k * 1, k * 2, k * 3, ..., k * n。这些元素的最大公约数是 k,且它们的和是最小的。
公式推导
-
数组中的元素是
k * 1, k * 2, ..., k * n,它们的和为:k×(1+2+3+...+n)=k×n(n+1)2k×(1+2+3+...+n)=k×2n(n+1)
其中,
1 + 2 + 3 + ... + n是前 n 个正整数的和,公式为 n(n+1)22n(n+1)。
因此,最终的数组元素之和为:
最小和=k×n(n+1)2最小和=k×2n(n+1)
代码实现
pythonCopy Code
def solution(n: int, k: int) -> int:
# 计算前 n 个正整数的和,公式为 n * (n + 1) // 2
sum_n = n * (n + 1) // 2
# 乘以 k 得到最小和
return sum_n * k
# 测试样例
if __name__ == '__main__':
print(solution(n=3, k=1) == 6) # 输出: 6
print(solution(n=2, k=2) == 6) # 输出: 6
print(solution(n=4, k=3) == 30) # 输出: 30
代码详解
-
计算前 n 个正整数的和:
- 使用公式 n(n+1)22n(n+1) 来快速计算前 n 个正整数的和。这个公式是数学中已知的求和公式,可以在常数时间 O(1)O(1) 内完成计算。
-
乘以 k 得到最小和:
- 由于数组中的每个元素都需要是 k 的倍数,我们将前 n 个正整数的和乘以 k,得到最终的最小和。
-
返回结果:
- 计算并返回最小和。
复杂度分析
- 时间复杂度:O(1)O(1),因为计算前 n 个正整数的和只需要常数时间。
- 空间复杂度:O(1)O(1),没有使用额外的空间。
测试样例
样例 1
输入:
Copy Code
n = 3, k = 1
输出:
Copy Code
6
解析:
- 数组为
1, 2, 3,和为 6,最大公约数为 1,满足条件。
样例 2
输入:
Copy Code
n = 2, k = 2
输出:
Copy Code
6
解析:
- 数组为
2, 4,和为 6,最大公约数为 2,满足条件。
样例 3
输入:
Copy Code
n = 4, k = 3
输出:
Copy Code
30
解析:
- 数组为
3, 6, 9, 12,和为 30,最大公约数为 3,满足条件。
学习总结
- 数学公式的运用:本题的关键是识别出需要选择数组元素为
k * 1, k * 2, ..., k * n这样的形式,从而通过数学公式快速计算出元素和。通过对数学公式的理解,可以大大提高解题效率。 - 贪心思想:本题是一个典型的贪心问题,通过选择最小的正整数 1, 2, 3, ..., n 来确保元素和最小,同时保证元素的最大公约数为 k。
- 时间和空间复杂度:由于我们使用了直接的数学计算方法,时间复杂度和空间复杂度都非常低,这也是算法优化的重要体现。
学习计划
-
基础数学知识:要解答类似的题目,掌握基本的数学公式和算法是非常有帮助的,特别是对常见求和公式、最大公约数等数学概念的理解。
-
刷题方法:
- 对于初学者来说,可以先从基础的数学题目和简单的数组题目入手,逐渐提高难度。
- 建议在刷题时,不仅要关注解法,还要注重思考题目背后的数学原理。
-
错题分析:遇到不会的题目时,及时分析错题,并查阅相关知识点。可以通过总结错题来强化自己的知识结构,避免以后再犯类似的错误。
工具运用
- AI辅导:利用 AI 刷题助手可以快速验证自己对解题思路的理解,尤其是在遇到卡壳时,可以通过 AI 提供的思路帮助理解题目。结合 AI 和其他学习资源,如算法书籍、视频教程等,能够更全面地掌握算法技巧。
- 学习资源整合:除了刷题,还可以通过阅读一些经典算法书籍,或参加一些在线算法比赛来提高自己的解题能力。