题目
推导
a1w1+(a1w2+a2w2)+(a1+a2+a3)w3+.(a1+a2+…+an)wn
+a2w1+(a2+a3)w2+…+(a2+a3+…+an)w(n-1)
+…
然后我们将所有w1合并,将所有w2合并,能得到:
(prefix[1]-prefix[0]+prefix[2]-prefix[1]+sum[3]…+prefix[n]-prefix[n-1])w1=(prefix[n]-prefix[0])w1
w2也合并:(prefix[n]+sum[n-1]-prefix[1]-prefix[0])w2=(prefix[n]-prefix[0])+prefix[n-1]-prefix[1]
…
wi的系数就是prefix[n-i+1]-prefix[i-1]+wi-1的系数
题解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 9;
const int mod = 1e9 + 7;
ll w[300004], sum[maxn], a[maxn];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum[i] = (sum[i - 1] + a[i]) % mod;
}
for (int i = 1; i <= n; i++)
cin >> w[i];
ll ans = 0;
ll coefficient = 0;
for (int i = 1; i <= n; i++)
{
coefficient = (coefficient + (sum[n - i + 1] - sum[i - 1]) % mod) % mod;
ans = (ans + coefficient * w[i] % mod) % mod;
}
cout << ans;
}