题目描述
小 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; }