问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k
。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例1:
输入:
n = 3 ,k = 1
输出:6
样例2:
输入:
n = 2 ,k = 2
输出:6
样例3:
输入:
n = 4 ,k = 3
输出:30
public class Main {
public static int solution(int n, int k) {
return n * (n + 1) / 2 * k;
}
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);
}
}
这个公式是基于等差数列求和的原理推导出来的。
等差数列求和公式
等差数列的求和公式是:
Sn=2n×(a1+an)
其中:
-
Sn 是前n项的和
-
n 是项数
-
a1 是首项
-
an 是末项
应用到本题
在本题中,我们需要计算从1到n的整数与k相乘后的和。这可以看作是一个等差数列,其中:
-
首项 a1=1×k=k
-
末项 an=n×k
-
项数 n 保持不变
将这些值代入等差数列求和公式,我们得到:
Sn=2n×(k+n×k)
简化这个公式:
Sn=2n×k×(1+n) Sn=2n×(n+1)×k
所以,从1到n的整数与k相乘后的和为:
2n×(n+1)×k
这就是代码中使用的公式。通过这个公式,我们可以直接计算出结果,而不需要使用列表和流,提高了性能和效率。