牛客國慶集訓派對Day4——G 區間權值(找規律,雙重字首和)
阿新 • • 發佈:2018-12-13
題目大意: 小 Bo 有 n 個正整數 a1..an,以及一個權值序列 w1…wn,現在他定義 現在他想知道 的值,需要你來幫幫他。你只需要輸出答案對 109+7 取模後的值
題解:
題目要求的是
...
即
可以發現每一行的對應列的w因數相同,對應相加可得
但是這樣求的話也是需要兩重迴圈來求......於是再來一次字首和(S[n]為sum的字首)
即
#include <cstdio> #include <cstring> #include <cmath> #include<algorithm> #include<iostream> #define mod 1000000007 using namespace std; typedef long long ll; ll sum[300010]; ll S[300010]; int a[300010],w[300010]; int main() { //freopen("input.txt","r",stdin); int n; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;++i) scanf("%d",&w[i]); for(int i=1;i<=n;++i) S[i]=S[i-1]+sum[i],S[i]%=mod; ll ans=0; for(int i=1;i<=n;++i) { ans+=((S[n]-S[n-i]-S[i-1]+mod)%mod*w[i]%mod)%mod; ans%=mod; } printf("%lld\n",ans); return 0; }