题目描述
小 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;
}
京公网安备 11010502036488号