14题|豆包MarsCode AI刷题

79 阅读2分钟

##思路分析

本题的核心在于满足条件的同时,使得数组元素之和尽可能小。


条件分解

  1. 数组中的所有元素两两不同

    • 数组中的每个元素必须是不同的数。
  2. 数组所有元素的最大公约数为 ( k )

    • 这意味着数组中的每个元素都必须是 ( k ) 的倍数。
  3. 数组元素之和尽可能小

    • 要让和尽可能小,就需要让数组中的元素尽量小,同时满足上面两个条件。

构造方法

  • 我们可以通过构造一个数组 ( a[i] ) 满足以上条件。
  • 从数学角度考虑:
    • 要使元素之和尽可能小,可以从最小的 ( k ) 的倍数开始构造。
    • 数组可以表示为:[ a[i] = k \times i ],其中 ( i = 1, 2, ..., n )。

数学公式

  • 构造的数组为:[ a = [k*1, k * 2, ..., k * n] ]。
  • 数组的和为: [ \text{sum} = k \times (1 + 2 + ... + n) = k \times \frac{n \times (n + 1)}{2} ]

测试样例

样例 1:( n = 3, k = 1 )

  • 数组构造:[ a = [1 \times 1, 1 \times 2, 1 \times 3] = [1, 2, 3] ]
  • 数组之和:[ \text{sum} = 1 + 2 + 3 = 6 ]
  • 输出:6

样例 2:( n = 2, k = 2 )

  • 数组构造:[ a = [2 \times 1, 2 \times 2] = [2, 4] ]
  • 数组之和:[ \text{sum} = 2 + 4 = 6 ]
  • 输出:6

样例 3:( n = 4, k = 3 )

  • 数组构造:[ a = [3 \times 1, 3 \times 2, 3 \times 3, 3 \times 4] = [3, 6, 9, 12] ]
  • 数组之和:[ \text{sum} = 3 + 6 + 9 + 12 = 30 ]
  • 输出:30

实现代码

根据上述分析,代码可以如下实现:

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

时间复杂度

  • 构造数组和计算和的过程均为 ( O(1) ),因此时间复杂度为 ( O(1) )。

这道题主要考察了以下几个方面的知识

  • 最大公约数 (GCD):

    • 题目要求构造一个数组,所有元素的最大公约数为 kk。这是一个典型的数论问题,考察如何通过倍数关系保证 GCD(a1,a2,…,an)=kGCD(a1​,a2​,…,an​)=k。
    • 解决方法是利用 kk 的倍数来构造数组。
  • 等差数列求和公式:

    • 通过公式 sum=k×n×(n+1)2sum=k×2n×(n+1)​,快速计算数组之和。

问题建模与公式化

  • 题目描述转化为数学公式:

    • 最大公约数的约束 → 数组元素必须是 kk 的倍数。
    • 元素之和最小 → 选择最小的 nn 个 kk 的倍数。
  • 这种转化能力是解决实际问题的重要技能。