题目描述
Sashka 有一个由 N 个正整数构成的序列 A0,A1,…,AN−1,一个正整数 K,以及一个等差数列(序列 P0,P1,… 是等差数列当且仅当存在常数 D 使得对所有 i≥1 有 Pi=D+Pi−1),该数列由其首项 S 和相邻两项之差 D 定义,且 S 与 D 均为正整数。
她关心的是 A 的长度为 K 的子序列(从一个序列中删去零个或多个元素,但不改变剩余元素的顺序,所得到的序列称为该序列的子序列),记作 B0,B1,…,BK−1。
请编写一个程序 arithmetic_progression,计算这样的子序列与等差数列的前 K 项对应相乘之和的最小值,即最小化如下求和式:
i=0∑K−1Bi×(S+i×D)
实现细节
你需要实现函数 solve:
__int128 solve(std::vector<long long> A, int K, long long S, int D)
- A:向量,包含 A0,A1,…,AN−1
- K:子序列的长度
- S:等差数列的首项
- D:等差数列的公差
你的函数应返回上述类型的最小可能和。由于结果可能非常大,你的函数应返回非标准的 __int128 类型(128 位整数)。头文件 arithmetic_progression.h 中包含了针对 << 和 >> 运算符的重载定义,允许对 __int128 变量使用 std::cin、std::cout 和 std::cerr。
输入格式
输入格式:
- 第 1 行:N K S D;
- 第 2 行:A0 A1 A2 ... AN−1。
输出格式
输出格式:
- 第 1 行:一个整数,等于
solve 返回的答案。
3 2 1 1
5 1 4
7
3 2 6 1
5 1 4
34
6 4 4 6
18 12 8 14 19 11
562
提示
样例 1 解释
等差数列为 {1,2}。我们选择 B={5,1},得到最优结果:5×1+1×2=7。
样例 2 解释
等差数列为 {6,7}。我们选择 B={1,4},得到最优结果:1×6+4×7=34。
样例 3 解释
等差数列为 {4,10,16,22}。我们选择 B={18,12,8,11},得到最优结果:$18 \times 4 + 12 \times 10 + 8 \times 16 + 11 \times 22 = 562$。
数据范围
- 1≤K≤N≤300 000
- 1≤D≤109
- 1≤Ai,S≤1015
子任务
| 子任务 |
分值 |
依赖的子任务 |
N |
其他限制 |
| 0 |
− |
样例测试。 |
| 1 |
5 |
0 |
≤20 |
− |
| 2 |
6 |
0−1 |
≤500 |
| 3 |
0−2 |
≤3 000 |
| 4 |
1 |
− |
≤100 000 |
K=N |
| 5 |
4 |
4 |
K≥N−1 |
| 6 |
4−5 |
K≥N−2 |
| 7 |
5 |
− |
A 是通过均匀随机打乱由作者为该测试点选定的某个序列 T 得到的。 |
| 8 |
0−7 |
− |
| 9 |
67 |
0−8 |
≤300 000 |
一个子任务的分数仅当该子任务及其所依赖子任务的全部测试数据均成功通过时才能获得。
翻译由 DeepSeek V4 Pro 完成