题目背景
JXCSP-S T2
题目描述
给定两个下标从 1 到 n 编号的序列 ai,bi,定义函数 S(l,r)(1≤l≤r≤n) 为:
i=l∑rai×i=l∑rbi
请你求出下列式子的值:
l=1∑nr=l∑nS(l,r)
由于答案可能很大,你只需要给出答案模10^9+7 后的结果。
输入格式
第一行一个正整数 n 表示序列长度。
第二行 n 个正整数表示 ai。
第三行 n 个正整数表示 bi。输出格式
仅一行一个整数表示答案模 10^9+7 后的结果。
输入输出样例
输入 #1复制
3 2 3 4 3 4 5输出 #1复制
244输入 #2复制
5 11 22 33 44 55 12 34 56 78 90输出 #2复制
201542说明/提示
【数据范围】
对于 20% 的数据:n≤10 ,ai,bi≤10;
对于 40% 的数据:n≤200 , ai,bi≤100;
对于 70% 的数据:n≤3000 , ai,bi≤10^5;
对于 100% 的数据:3≤n≤5×10^5 , 1≤ai,bi≤109。
代码:70
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a[1000010],b[1000010];
int asum[1000010],bsum[1000010];
int ans;
signed main(){
//freopen(" .in","r",stdin);
//freopen(" .out","w",stdout);
cin >> n;
for(int i = 1;i<=n;i++) cin >> a[i];
for(int i = 1;i<=n;i++) cin >> b[i];
for(int i = 1;i<=n;i++) asum[i]=asum[i-1]+a[i];//处理前缀和数组
for(int i = 1;i<=n;i++) bsum[i]=bsum[i-1]+b[i];
for(int i = 1;i<=n;i++){
for(int j = i;j<=n;j++){
ans+=(asum[j]-asum[i-1])*(bsum[j]-bsum[i-1]);
ans=ans%(1000000007);
}
}
cout << ans;
return 0;
}