首先感谢 yhf dalao 找的考前模拟题!!!!
😔题目名称其实也给暗示了,不过没想到后面的积的套娃前缀和,这道题要特别注意的是取模操作,要在每一项后面加一个 mod 然后再取模,不然可能会出现溢出后为负数的现象
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=500010;
const ll mod=7+1e9;
ll n,a[maxn],b[maxn],suma[maxn],sumb[maxn],
mula[maxn],mulb[maxn],mul[maxn],ans=0;
int main()
{
scanf("%d",&n);
suma[0]=sumb[0]=mul[0]=mula[0]=mulb[0]=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
suma[i]=(suma[i-1]+a[i])%mod;
}
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
sumb[i]=(sumb[i-1]+b[i])%mod;
}
for(int i=1;i<=n;i++){
mul[i]=(mul[i-1]+suma[i]*sumb[i]%mod)%mod;
mula[i]=(mula[i-1]+suma[i])%mod;
mulb[i]=(mulb[i-1]+sumb[i])%mod;
}
for(int i=1;i<=n;i++){
ll tmp1=(mul[n]-mul[i-1]+mod)%mod;
ll tmp2=(sumb[i-1]*((mula[n]-mula[i-1]+mod)%mod)+mod)%mod;
ll tmp3=(suma[i-1]*((mulb[n]-mulb[i-1]+mod)%mod)+mod)%mod;
ll tmp4=((n-i+1)*((suma[i-1]*sumb[i-1]+mod)%mod)+mod)%mod;
ans=(ans+tmp1-tmp2-tmp3+tmp4+mod)%mod;
}
printf("%lld\n",ans);
return 0;
}