C语言/数据结构数学题解:构造n个两两不同且最大公约数为k的数组,求最小和
问题描述小C希望构造一个包含 n 个正整数的数组且满足以下条件数组中的所有元素两两不同。数组所有元素的最大公约数为k。数组元素之和尽可能小。任务是输出该数组元素之和的最小值。注意数组元素必须为正整数。输入格式输入包含两个整数n和k含义如题所述。约束条件1 ≤ n ≤ 10^51 ≤ k ≤ 10^5输出格式输出一个整数表示满足条件的数组元素之和的最小值。测试样例样例1输入n 3, k 1输出6解释当 k1 时数组元素可以是任意正整数。为了满足元素两两不同且和最小最小的 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.hlong 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; }运行结果