P5686 [CSP-S2019 江西] 和积和

 

#include <cstdio>
#include <iostream>

#define N 500010
#define ll long long

using namespace std;
const int mod = 1e9 + 7;
int n;
ll a[N], b[N], sa[N], sb[N], qz[N], qza[N], qzb[N];

ll read() {
    ll s = 0, f = 0; char ch = getchar();
    while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
    while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
    return f ? -s : s;
}

int main() {
    n = read();
    for (int i = 1; i <= n; i++)
        a[i] = read(), sa[i] = (sa[i - 1] + a[i]) % mod;
    for (int i = 1; i <= n; i++)
        b[i] = read(), sb[i] = (sb[i - 1] + b[i]) % mod;
    for (int i = 1; i <= n; i++) {
        qza[i] = (qza[i - 1] + sa[i]) % mod;
        qzb[i] = (qzb[i - 1] + sb[i]) % mod;
        qz[i] = (sa[i] * sb[i] % mod + qz[i - 1]) % mod;
    }
    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        ll sf = (qz[n] - qz[i - 1] + mod) % mod;
        ll sy = ((qzb[n] - qzb[i - 1] + mod) % mod * sa[i - 1]) % mod;
        ll sq = ((qza[n] - qza[i - 1] + mod) % mod * sb[i - 1]) % mod;
        ll sp = ((n - i + 1) * ((sa[i - 1] * sb[i - 1]) % mod)) % mod;
        ans = (ans + sf - sy - sq + sp + mod) % mod;
    }
    cout << ans;
}

 

posted @ 2023-09-03 10:12  JMXZ  阅读(33)  评论(0)    收藏  举报