给出一个长度为n的数组,求所有(区间的和)的和。
先来模拟一下
将上面的数整合一下统计一下个数
因为n<=100000所以不可能用双重循环把这一个表制出来
再瞅瞅
这个表是对称的,将n/2,取左上角的小矩阵
再看每一列,前i个是一个等差数列求和,后几面剩下的是等差数列求和最后一个数
所以小矩阵的每一列的和是
至于n%2=1的话再加上i即可
#include<bits/stdc++.h>
using namespace std;
long long mm=1e9+7;
long long n,m,j;
long long ans;
long long a[110000],s[110000];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
m=n%2; j=n; n/=2;
for(int i=1;i<=n;i++)
s[i]=s[j--]=i*(i+1)/2+i*(n-i);
s[n+m]=s[n];
for(int i=1;i<=n*2+m;i++)
s[i]=s[i]*2;
j=n*2+m;
if(m==1)
{
for(int i=1;i<=n;i++)
s[i]+=i,s[j--]=s[i];
s[n+m]+=n+m;
}
for(int i=1;i<=n*2+m;i++)
ans+=a[i]*s[i];
printf("%lld",ans%mm);
return 0;
}