问题描述
小C希望构造一个包含 n 个正整数的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
注意:数组元素必须为正整数。
输入格式
输入包含两个整数:n和k,含义如题所述。
约束条件
- 1 ≤ n ≤ 10^5
- 1 ≤ k ≤ 10^5
输出格式
输出一个整数,表示满足条件的数组元素之和的最小值。
测试样例
样例1:
输入:n = 3, k = 1
输出:6
解释:当 k=1 时,数组元素可以是任意正整数。为了满足元素两两不同且和最小,最小的 n 个正整数是 [1, 2, 3],其和为 6。
样例2:
输入:n = 2, k = 2
输出:6
解释:数组元素必须是 2 的倍数,且两两不同。最小的两个正偶数是 [2, 4],和为 6。注意,虽然 [2, 4] 的和是 6,但题目要求最大公约数为 2,且元素两两不同,所以这是最优解。
样例3:
输入:n = 4, k = 3
输出:30
解释:数组元素必须是 3 的倍数,且两两不同。最小的四个正 3 的倍数是 [3, 6, 9, 12],其和为 30。注意,虽然 [3, 6, 9, 12] 的和是 30,但题目要求最大公约数为 3,且元素两两不同,所以这是最优解。
程序代码
#include <stdio.h>
long long minSum(int n, int k) {
// 使用 long long 防止溢出
long long sum = (long long)n * (n + 1) / 2;
return sum * k;
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
printf("%lld\n", minSum(n, k));
return 0;
}
#include <stdio.h> long long minSum(int n, int k) { // 使用 long long 防止溢出 long long sum = (long long)n * (n + 1) / 2; return sum * k; } int main() { int n, k; scanf("%d %d", &n, &k); printf("%lld\n", minSum(n, k)); return 0; }