题目描述

小 Bo 有 n 个正整数 a1..an,以及一个权值序列 w1…wn,现在他定义 。现在他想知道 的值,需要你来帮帮他。
你只需要输出答案对 109+7 取模后的值

输入描述:

第一行一个正整数 n
第二行 n 个正整数 a1..an
第三行 n 个正整数 w1..wn

输出描述:

输出答案对 109+7 取模后的值

题解

这种题我们就把式子展开找规律就好了
我以n=6为例
图片说明
仔细观察会发现w1和w6,w2和w5,w3和w4的系数是相同的,并且对于每个系数之间都是加上一段连续的区间和(或者减去一段连续的区间和)而得到的。然后我们就可以根据推出来的规律写代码啦
图片说明

代码

/*
* Coder: niiii
* Language: cpp
*/

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+100;
const int mod=1e9+7;
ll a[N],w[N],suma[N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    for(int i=1;i<=n;++i)cin>>w[i];
    for(int i=1;i<=n;++i){
        suma[i]=(suma[i-1]+a[i])%mod;
    }
    ll ans=0,sum=0;
    for(int i=1,len=(n+1)/2;i<=len;++i){
        sum=(sum+suma[n-i+1]-suma[i-1]+mod)%mod;
        ans=(ans+sum*w[i])%mod;
        if(i!=n-i+1)ans=(ans+sum*w[n-i+1])%mod;
    }
    cout<<ans<<endl;
}