#贪心
## 题目大意
给定一个长度为 $n$ 的数组 $a$,你需要进行 $k$ 次操作,每一次操作都可以选择一个连续的子序列(可以为空),然后将这个子序列的和作为一个元素插入到这个数组当中。问你最后数组的和最大能够是多少,对 $10^9+7$ 取模。
## 思路
首先,题目告诉了我们这题是「最大值取模」而不是「取模后的最大值」,因此我们可以考虑贪心。我们可以先找到最大字段和,然后把它的和插入到旁边这个操作等同于对最大字段和的值 $\times 2$,而不会新加入其他的元素。因此,我们直接模拟就可以了。
## 代码
```cpp
#include <iostream>
using namespace std;
using LL = long long;
const LL kMaxN = 2e5 + 5, kMod = 1e9 + 7;
LL a[kMaxN], dp[kMaxN], t, n, k, mx, ans;
int main() {
for (cin >> t; t; t--) {
cin >> n >> k, ans = mx = 0;
for (LL i = 1; i <= n; i++) {
cin >> a[i];
}
for (LL i = 1; i <= n; i++) { // 求最大字段和
mx = max(mx, dp[i] = max(dp[i - 1] + a[i], a[i]));
}
ans = -mx; // 注意 ans 需要额外减去原来的部分
for (; k--; mx = mx * 2 % kMod) { } // 增长 n 次
for (LL i = 1; i <= n; i++) {
ans = (ans + a[i] + kMod) % kMod; // 求数组和
}
cout << (ans + mx + kMod) % kMod << '\n'; // 加起来
}
return 0;
}
```