数组元素之和最小化 | 豆包MarsCode AI刷题

48 阅读2分钟

问题描述

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

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

任务是输出满足条件的数组元素之和的最小值


示例分析

样例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. 关键条件
    数组的所有元素的最大公约数为 kk,说明数组元素可以表示为:

    ai=k×bia_i = k \times b_i

    其中,bib_i 是一个正整数,并且数组中的 bib_i 值需要两两不同。

  2. 如何使和最小

    • bib_i 为从 1 开始的连续正整数:1, 2, ..., n
    • 数组元素为:
      ai=k×i(i=1,2,...,n)a_i = k \times i \quad (i = 1, 2, ..., n)
  3. 计算最小和

    • 数组元素之和为:
      sum=k×(1+2+...+n)\text{sum} = k \times (1 + 2 + ... + n)
    • 等差数列求和公式:
      1+2+...+n=n×(n+1)21 + 2 + ... + n = \frac{n \times (n + 1)}{2}
    • 因此:
      sum=k×n×(n+1)2\text{sum} = k \times \frac{n \times (n + 1)}{2}

代码实现

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)

知识总结与学习建议

知识总结

  1. 最大公约数的应用:

数组的 GCD 限制了元素的倍数关系,需要通过构造公式满足条件。

  1. 等差数列求和公式:

利用公式快速计算总和,简化了代码复杂度。

  1. 时间复杂度优化:

通过数学推导直接求解,避免了复杂的循环操作。

  1. 边界条件的处理:

包括 n=1 和 k=1 的情况需要特别注意,保证数组元素满足所有要求。

学习建议

  1. 数学公式的熟练掌握:

学习并熟练使用等差数列等常用数学公式,能大幅提高解题效率。

  1. 边界条件的考虑:

测试用例需要覆盖到最小值和最大值的场景,确保代码鲁棒性。

  1. 算法优化:

通过简单公式推导解决复杂问题,减少不必要的循环操作。

工具运用

  1. 使用AI刷题工具快速生成题目和测试用例。

  2. 借助数学可视化工具(如 Wolfram Alpha)验证公式正确性。

通过系统化练习和工具辅助,逐步提升数学和算法结合题目的解题能力。