1. 程式人生 > >區間權值 字首和

區間權值 字首和

時間限制: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);
}