求解:l=1nr=lnwrl+1i=lrai\sum_{l=1} ^n \sum_{r=l} ^n w_{r-l+1}*\sum_{i=l} ^ra_i
定义:si=j=1iaj,sumi=j=1isjs_i=\sum_{j=1} ^i a_j ,sum_i=\sum_{j=1} ^i s_j
\Longrightarrow l=1nr=lnwrl+1(srsl1)\sum_{l=1} ^n \sum_{r=l} ^n w_{r-l+1}*(s_r-s_{l-1})
换种角度,原命题转换为以r结尾长度为len的区间的所有和
\Longrightarrow len=1nwlenr=lenn(srsrlen)\sum_{len=1} ^n w_{len}*\sum_{r=len} ^n(s_r-s_{r-len})
r=lenn(srsrlen)=r=lennsrr=lennsrlen\sum_{r=len} ^n(s_r-s_{r-len})=\sum_{r=len} ^ns_r-\sum_{r=len} ^ns_{r-len}
\Longrightarrow sumnsumlen1sumlensum_n-sum_{len-1}-sum_{len}
所以:len=1nwlenr=lenn(srsrlen)=len=1n(sumnsumlen1sumlen)\sum_{len=1} ^n w_{len}*\sum_{r=len} ^n(s_r-s_{r-len})=\sum_{len=1} ^n(sum_n-sum_{len-1}-sum_{len})

#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using pll = pair<ll, ll>;
const ll mod = 1e9 + 7;
void dilingtian()
{
    int n;
    cin >> n;
    vector<long long> a(n + 1), w(n + 1), s(n + 1), sum(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> w[i];
    for (int i = 1; i <= n; i++)
    {
        s[i] = s[i - 1] + a[i];
        sum[i] = sum[i - 1] + s[i];
    }
    long long ans = 0;
    for (int len = 1; len <= n; len++)
      //sum[n]-sum[len-1]-sum[n-len]范围是1e7,w[len]也是1e7,如果直接相乘会爆掉long long
      //所以采用先取余在相乘的做法
        ans = (ans + (sum[n] - sum[len - 1] - sum[n - len] + mod) % mod * w[len] + mod) % mod;
    cout << ans << endl;
}
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    // cin >> t;
    t = 1;
    while (t--)
        dilingtian();
    return 0;
}