首先说一种错误的做法,直接将所有元素放到堆里面,然后每次让最大的两个元素出堆,然后放入,这样会导致非常大,不能够这样做,并且由于需要比大小,所以中间过程不能够取模。

正解的话可以举例子看一下:

 6 = 1 * 6 = 2 * 3
20 = 1 * 20 = 2 * 10 = 4 * 5

可以发现总是这样形式的和最大,详细证明题解区已经有了,可以去看看。

那么我们就可以给他排序,对于次操作,其实就是最大的个数的乘积,加上。 最后再加上剩余的元素即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int MOD = 1e9 + 7;
signed main() {
    close;
    int n,k;
    cin >> n >> k;
    vector<int> a(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(),a.end());
    int res = k;
    int mul = 1;
    k += 1;
    //[n - 1,n  - k]
    for(int i = n - 1;i >= n - k; i--){
        mul *= a[i];
        mul %= MOD;
    }
    res += mul;
    res %= MOD;
    for(int i = n - k - 1; i >= 0; i--){
        res += a[i];
        res %= MOD;
    }
    cout << res << endl;
    
    return 0;
}