问题分析
这个问题要求我们构造一个包含 n 个元素的数组,满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数(GCD)为
k。 - 数组元素之和尽可能小。
我们的目标是:给定 n 和 k,构造一个符合条件的数组,使其元素和最小,并输出该和。
思路分析
-
最大公约数为
k:- 数组元素的最大公约数是
k,意味着所有元素都可以看作是k的倍数。因此,我们可以将所有元素表示为k * m1, k * m2, ..., k * mn,其中m1, m2, ..., mn是n个互不相同的正整数。
- 数组元素的最大公约数是
-
求最小和:
- 我们需要选择最小的
n个正整数,使得它们互不相同,并且它们的最大公约数为 1。 - 因为数组元素是
k * mi,所以我们要求的最小和其实是:k * (m1 + m2 + ... + mn),其中m1, m2, ..., mn是互不相同的正整数,并且它们的最大公约数为 1。
- 我们需要选择最小的
-
选择最小的
n个互不相同的整数:- 选取的整数应该是从
1开始的最小整数集,保证它们的最大公约数为 1。例如,对于n = 3,我们选择1, 2, 3,因为它们的最大公约数为 1。
- 选取的整数应该是从
-
计算最小和:
- 选择最小的
n个正整数时,得到的和就是1 + 2 + 3 + ... + n,也就是n * (n + 1) / 2。 - 最终数组的和是
k * (1 + 2 + ... + n),即k * (n * (n + 1) / 2)。
- 选择最小的
代码实现 public class Main {
// 计算最小的数组元素和
public static int solution(int n, int k) {
// 求 1 到 n 的和
int sum = n * (n + 1) / 2;
// 数组元素之和是 k 乘以 1 到 n 的和
return k * sum;
} public static void main(String[] args) {
System. out. println(solution(3, 1) == 6);
System.out.println(solution(2,2) == 6);
System. out. println(solution(4, 3) == 30);
} }
代码解析
-
solution方法:- 计算从
1到n的和:sum = n * (n + 1) / 2。这是求自然数和的公式。 - 最终的数组元素之和是
k * sum,因为每个元素是k的倍数。
- 计算从
-
main方法:- 用于测试
solution方法,输出对应的结果。
- 用于测试
测试
测试用例1
输入:n = 3, k = 1
输出:6
解释:最小的3个互不相同的正整数是 1, 2, 3,它们的和为 1 + 2 + 3 = 6。因此,数组元素和是 1 * 6 = 6。
测试用例2
输入:n = 2, k = 2
输出:6
解释:最小的2个互不相同的正整数是 1, 2,它们的和为 1 + 2 = 3。因此,数组元素和是 2 * 3 = 6。
测试用例3
输入:n = 4, k = 3
输出:30
解释:最小的4个互不相同的正整数是 1, 2, 3, 4,它们的和为 1 + 2 + 3 + 4 = 10。因此,数组元素和是 3 * 10 = 30。
时间复杂度分析
- 时间复杂度:O(1),因为我们只进行了一些简单的算术计算。
- 空间复杂度:O(1),只使用了少量的额外空间。
总结
本题的关键是将数组元素看作 k 的倍数,然后通过选择最小的 n 个互不相同的正整数来构造数组。这些整数的和是 n * (n + 1) / 2,最终的数组元素和是该和乘以 k。该问题的解决方案简单高效,能够在常数时间内计算出结果。