不太会化简公式,写了个暴力,计算了一下每个wi对应的区间

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>P;
vector<P>G[1000];
int main() {
    int n;
    scanf("%d",&n);
    int ans=0;
    for(int l=1; l<=n; ++l) {
        for(int r=l; r<=n; ++r) {
            G[r-l+1].push_back(P(l,r));
        }
    }
    for(int i=1; i<=n; ++i) {
        for(int j=0; j<G[i].size(); ++j) {
            printf("%d %d\n",G[i][j].first,G[i][j].second);
        }
        printf("------>\n");
    }
    return 0;
}

然后得出规律求解即可:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=3e5+500;
ll a[N],b[N],sum[N];
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; ++i) {
        scanf("%lld",&a[i]);
        sum[i]=(sum[i-1]+a[i])%mod;
    }
    for(int i=1; i<=n; ++i) {
        scanf("%lld",&b[i]);
    }
    ll ans=0,cut=0;
    for(int i=1; i<=n; ++i) {
        cut=(cut+(sum[n-i+1]-sum[i-1]+mod)%mod)%mod;
        ans=(ans+cut*b[i]%mod)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}