小红的数组构造

[题目链接](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();
});

复杂度分析

  • 时间复杂度:,只需一次数学运算。
  • 空间复杂度:,只使用常数个变量。