小红的数组构造
[题目链接](https://www.nowcoder.com/practice/8844c80d55534f4e99bc0c1184a052e8)
思路
构造一个长度为 的数组,要求所有元素互不相同,且
恰好等于
,同时使元素之和最小。
关键观察
所有元素的 ,意味着每个元素都必须是
的倍数。设数组元素为
,其中
为互不相同的正整数,且
(否则公因子可以提出来,
就会大于
)。
要使总和 最小,只需让
尽量小。
最优构造
取 (即
),此时:
- 元素互不相同。
,所以原数组的
。
- 和
,这已经是最小的
个不同正整数之和,不可能更小。
样例验证
:数组为
,和
。
:数组为
,和
。
代码
#include <iostream>
using namespace std;
int main() {
long long n, g;
cin >> n >> g;
cout << g * n * (n + 1) / 2 << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long g = sc.nextLong();
System.out.println(g * n * (n + 1) / 2);
}
}
n, g = map(int, input().split())
print(g * n * (n + 1) // 2)
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (line) => {
const [n, g] = line.trim().split(' ').map(BigInt);
console.log((g * n * (n + 1n) / 2n).toString());
rl.close();
});
复杂度分析
- 时间复杂度:
,只需一次数学运算。
- 空间复杂度:
,只使用常数个变量。

京公网安备 11010502036488号