链接
题意
给出一段序列,求所有连续区间和。
题解
求两次前缀和sum[], sum2[],答案就是total[sum[i]*i - sum2[i-1]]。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long lint;
const lint mod = 1000000007;
#define maxn (447777)
int a[maxn];
lint sum[maxn], sum2[maxn];
int main()
{
int T;
cin >> T;
while(T--)
{
int N;
cin >> N;
for(int i = 0; i <= N; i++)
sum[i] = sum2[i] = d[i] = 0;
for(int i = 1; i <= N; i++)
scanf("%d", &a[i]);
sum[1] = a[1];
for(int i = 2; i <= N; i++)
{
sum[i] += a[i] + sum[i-1];
sum[i] %= mod;
}
sum2[1] = sum[1];
for(int i = 2; i <= N; i++)
{
sum2[i] += sum[i] + sum2[i-1];
sum2[i] %= mod;
}
lint o = a[1];
for(int i = 2; i <= N; i++)
{
o += ((sum[i] * i) % mod + mod - sum2[i-1]) % mod;
o %= mod;
}
cout << o << endl;
}
return 0;
}