为了构造一个满足条件的数组,我们需要确保数组中的元素两两不同,且它们的最大公约数为 k。同时,我们希望数组元素之和尽可能小。
一个简单且有效的方法是从 k 开始,每次递增 k 的倍数(同时确保这些倍数在递增过程中是唯一的),直到我们收集到 n 个这样的数。由于这些数都是 k 的倍数,它们的最大公约数自然是 k。
为了使数组元素之和最小,我们应该从 k 本身开始(这是 k 的最小倍数),然后是 k+1 中第一个不是 k 的倍数的数(但它需要与 k 互质以确保能构造出以 k 为最大公约数的组合),但这种方法稍显复杂,因为我们需要确保所有选出的数两两互质且与 k 的最大公约数为 k(这实际上意味着它们除以 k 后应该是互质的)。但更简单的方法是直接选择 k 的连续倍数(跳过那些已经是之前选过的倍数的数,以确保唯一性),因为题目只要求最大公约数为 k,并没有要求数组中的元素必须是连续的整数或者必须是 k 的最小倍数集合中的元素。
然而,为了最小化和,最直接的方法是选择 k, 2k, 3k, ... 中的前 n 个与 k 互质的倍数(或者更确切地说,是选择那些除以 k 后结果互质的数)。但由于 k 本身已经确保与所有选出的数有最大公约数 k,我们实际上只需要确保选出的数是唯一的且尽可能小。
但这里有一个陷阱:如果 k 不是1,那么 k, 2k, 3k, ... 显然不是两两不同的数在模 k 意义下的表示(它们都会变成 0, 2k%k, 3k%k, ...,即 0, 0, 0, ... 这不是我们想要的)。因此,我们需要对 k 的倍数进行微调,以确保它们作为整数是唯一的。
一个简单的方法是选择 k, k+1, k+2, ... 中的数,但只保留那些与 k 互质的数(在模 k 意义下不同的数)。然而,在这个特定问题中,由于我们只需要 n 个数,且要求它们的最大公约数为 k,我们可以简单地选择 k, 2k, 3k, ... 中的前 n 个数(在整数意义上),因为当我们将这些数作为数组元素时,它们的最大公约数显然是 k(假设 k 是这些数的公约数中的最大值,且由于我们是从 k 开始选择的倍数,所以 k 必然是这些数的公约数)。同时,由于这些数是 k 的连续倍数,它们在整数意义上是唯一的。
但为了满足题目中“数组中的所有元素两两不同”的严格要求(尽管在这个特定情境下选择 k, 2k, 3k, ... 已经保证了这一点,因为它们是连续的整数倍数),并且为了简化问题,我们可以选择 k, k+1, k+2, ..., k+(n-1) 中的前 n 个与 k 互质的数(在实际情况中,由于 k 与 k+i(i 不为0)总是互质的,所以这一步其实是多余的,但这里为了严谨性还是提一下)。然而,为了最小化和,我们直接选择 k, 2k, 3k, ..., nk(其中 nk 是小于或等于某个阈值以确保唯一性的最大倍数,但在这个问题中,由于我们只需要 n 个数,所以直接选择到 nk = k*n 即可,尽管这可能会导致一些浪费,但它是简单且正确的)。
下面是完成任务的C++代码:
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, int k) {
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i * k;
}
return sum;
}
int main() {
cout << (solution(3, 1) == 6) << endl;
cout << (solution(2, 2) == 6) << endl;
cout << (solution(4, 3) == 30) << endl;
}