解析:
探讨一下: 当n=3的时候
l=1: a1*(3a1+2a2+a3)+a2*(2a2+a3)+a3a3
l=2: a2*(2a2+a3)+a3a3
l=3:a3a3
我们用前缀和处理一下(3a1+2a2+a3)
然后再用前缀和处理一下a1(3a1+2a2+a3)+a2*(2a2+a3)+a3a3
最后枚举l,利用差分算出当前l的贡献
注意的是差分有可能出现负数,所以我们要把它变成正数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+1000;
const int MOD=1e9+7;
ll a[N];
int n;
ll add[N];
ll mul[N];
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++)
{
add[i]=(add[i-1]+((n-i+1)*a[i])%MOD)%MOD;
}
for(int i=1;i<=n;i++)
{
mul[i]=(mul[i-1]+(a[i]*(add[n]-add[i-1]))%MOD)%MOD;
}
ll res=0;
for(int i=1;i<=n;i++)
{
res=(res+((mul[n]-mul[i-1])%MOD+MOD)%MOD)%MOD;
}
cout<<res<<endl;
}