區間權值 字首和
阿新 • • 發佈:2018-12-13
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 1048576K,其他語言2097152K 64bit IO Format: %lld
題目描述
小 Bo 有 n 個正整數 a1..an,以及一個權值序列 w1…wn,現在他定義 現在他想知道 的值,需要你來幫幫他 你只需要輸出答案對 109+7 取模後的值
輸入描述:
第一行一個正整數 n 第二行 n 個正整數 a1..an 第三行 n 個正整數 w1..wn
輸出描述:
輸出答案對 109+7 取模後的值
示例1
輸入
3 1 1 1 1 1 1
輸出
10
備註:
1≤ n≤ 3x 105 1≤ ai≤ 107 1≤ wi≤ 107
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<cstdio> #include<string> #include<math.h> #include<algorithm> #include<map> #include<set> //#define mod 998244353 #define INF 0x3f3f3f3f #define eps 1e-6 using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn=3e5+10; ll w[maxn]; ll a[maxn]; ll f[maxn];//a[i]的字首和 ll g[maxn];//g[i]的字首和 int main() { int n; scanf("%d",&n); a[0]=0;f[0]=0; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); f[i]=(f[i-1]+a[i])%mod; } for(int i=1;i<=n;i++) scanf("%lld",&w[i]); g[0]=0; for(int i=1;i<=n;i++) g[i]=(f[i]+g[i-1])%mod; ll ans=0; for(int i=1;i<=n;i++) ans=(ans+(g[n]-g[n-i]-g[i-1])*w[i]%mod)%mod; printf("%lld\n",(ans+mod)%mod); }