输入一个长度为n的数组a包括(n+1)n/2
个区间。每个区间所有数的和,被称为区间和,求所有(n+1)n/2
个区间和的和。由于数值较大,输出mod 1e9+7的结果。
例如:
3个数1 2 3,共有6个子区间,包含的数字如下:
{1} {2} {3} {1 2} {2 3} {1 2 3},这些区间求和为1 2 3 3 5 6,这6个数字再求和为20.
求出每个位置上的数出现的个数再乘以该位置上的数字
例:5个数 1 2 3 4 5
举3为例:
从3往后:有3, 3 4, 3 4 5,(n-i+1)=(5-3+1)=3种情况
然后往前看有i=3种情况 不包含,包含2,包含1,2
组合起来就是i*(n-i+1)=9种情况
同时可以发现它是中间对称的情况
再注意数据过大用long long就行
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long a[100010];
int main()
{
ios::sync_with_stdio(false);
int n;
long long sum=0,tmp;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
long long i;
for(i=1;2*i<=n;i++)
{
sum=(sum+(i*(n-i+1)*(a[i]+a[n-i+1])%mod))%mod;
}
if(n%2)
sum=(sum+i*(n-i+1)*a[i]%mod)%mod;
cout<<sum;
return 0;
}