题解:P5686 [CSP-S2019 江西] 和积和
题目链接
首先遇到这种题不要慌,可以先转化为前缀和,
拆开,变成:
我们首先枚举一个端点,此处枚举的是
对于每一个
对于
于是就做完了,时间复杂度
代码
#include<bits/stdc++.h>
#define N 500005
#define ll long long
#define mod 1000000007
using namespace std;
ll n,ans,a[N],b[N],sa[N],sb[N],qja[N];
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",a+i);
a[i]+=a[i-1];
a[i]%=mod;
}
for(int i=1;i<=n;i++){
scanf("%lld",b+i);
b[i]+=b[i-1];
b[i]%=mod;
}
for(int i=1;i<=n;i++){
sa[i]=(sa[i-1]+a[i])%mod;
sb[i]=(sb[i-1]+b[i])%mod;
}
for(int i=1;i<=n;i++)qja[i]=(qja[i-1]+(a[i]*b[i])%mod)%mod;
for(int i=1;i<=n;i++){
ans=(ans+((i*a[i])%mod*b[i])%mod)%mod;
ans=(ans-((a[i])%mod*sb[i-1])%mod+mod)%mod;
ans=(ans-((sa[i-1])%mod*b[i])%mod+mod)%mod;
ans=(ans+qja[i-1])%mod;
}
printf("%lld\n",ans);
return 0;
}