数组的极差和 -- 阅读理解和取模运算
#include<bits/stdc++.h>
using namespace std;
const int MOD = 7 + 1e9;
const int MAXN = 1e5;
int N;
long long A[MAXN+10];
int main(){
cin >> N;
for(int i = 1; i<=N;i++){
cin >> A[i];
}
// 由于B为排序数组,取极差的必为区间的首尾元素
// 暴力求解 n * n
//long long result = 0;
//for(int i = 1; i < N;i++){
// for(int j = i + 1; j <= N; j++){
// result += (j - i) * ((A[i]) * (A[j]))%MOD ;
// result = result % MOD;
// }
//}
// 暴力解法的第二个循环可以合并
// 逆序累加和
long long reCDF_jA[N+1];
long long reCDF_A[N+1];
reCDF_jA[N] = (N * A[N]) %MOD;
reCDF_A[N] = A[N];
for(int j = N-1 ; j>=1; j--){
reCDF_jA[j] = (j*A[j] + reCDF_jA[j+1])%MOD;
reCDF_A[j] = (A[j] + reCDF_A[j+1])%MOD;
}
long long result = 0;
for(int i = 1; i < N ;i++){
long long temp = ((reCDF_jA[i+1] - i * reCDF_A[i+1])%MOD + MOD)%MOD;
result += (temp * A[i])%MOD;
// 取模减法
result = result % MOD;
}
cout << result << endl;
return 0;
}