2651 区间和的和

输入一个长度为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值