问题描述
小C希望构造一个包含 n 个元素的数组,并满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数 (GCD) 为
k。 - 数组元素之和尽可能小。
任务是输出满足条件的数组元素之和的最小值。
示例分析
样例1
输入:
n = 3, k = 1
分析:
- 数组的 GCD 为 1,说明数组中的元素可以为任意正整数。
- 要求和尽可能小,优先选择从 1 开始的连续正整数。
- 数组为
[1, 2, 3],和为1 + 2 + 3 = 6。
输出: 6
样例2
输入:
n = 2, k = 2
分析:
- 数组的 GCD 为 2,所有元素必须是 2 的倍数。
- 要求和尽可能小,优先选择从 2 开始的连续正整数的倍数。
- 数组为
[2, 4],和为2 + 4 = 6。
输出: 6
样例3
输入:
n = 4, k = 3
分析:
- 数组的 GCD 为 3,所有元素必须是 3 的倍数。
- 要求和尽可能小,优先选择从 3 开始的连续正整数的倍数。
- 数组为
[3, 6, 9, 12],和为3 + 6 + 9 + 12 = 30。
输出: 30
解决思路
思路解析
-
关键条件
数组的所有元素的最大公约数为 ,说明数组元素可以表示为:其中, 是一个正整数,并且数组中的 值需要两两不同。
-
如何使和最小
- 让 为从
1开始的连续正整数:1, 2, ..., n。 - 数组元素为:
- 让 为从
-
计算最小和
- 数组元素之和为:
- 等差数列求和公式:
- 因此:
- 数组元素之和为:
代码实现
def solution(n: int, k: int) -> int:
# 利用公式计算数组最小和
return k * (n * (n + 1)) // 2
# 测试用例
if __name__ == '__main__':
print(solution(3, 1) == 6)
print(solution(2, 2) == 6)
print(solution(4, 3) == 30)
知识总结与学习建议
知识总结
- 最大公约数的应用:
数组的 GCD 限制了元素的倍数关系,需要通过构造公式满足条件。
- 等差数列求和公式:
利用公式快速计算总和,简化了代码复杂度。
- 时间复杂度优化:
通过数学推导直接求解,避免了复杂的循环操作。
- 边界条件的处理:
包括 n=1 和 k=1 的情况需要特别注意,保证数组元素满足所有要求。
学习建议
- 数学公式的熟练掌握:
学习并熟练使用等差数列等常用数学公式,能大幅提高解题效率。
- 边界条件的考虑:
测试用例需要覆盖到最小值和最大值的场景,确保代码鲁棒性。
- 算法优化:
通过简单公式推导解决复杂问题,减少不必要的循环操作。
工具运用
-
使用AI刷题工具快速生成题目和测试用例。
-
借助数学可视化工具(如 Wolfram Alpha)验证公式正确性。
通过系统化练习和工具辅助,逐步提升数学和算法结合题目的解题能力。