区间和的和
题目大意:
给出一个数组,求出所有区间和的总和
输入样例:
3
1
2
3
输出样例:
20
数据范围:
对于30%的数据:1⩽n⩽1001\leqslant n\leqslant 1001⩽n⩽100
对于50%的数据:1⩽n⩽10001\leqslant n\leqslant 10001⩽n⩽1000
对于100%的数据:1⩽n⩽1000001\leqslant n\leqslant 1000001⩽n⩽100000
解题思路:
直接枚举所有区间会TLE
那我们从每个数下手
每个数可能在多少个区间中出现呢
首先可以发现区间的最前端要小于等于i(i种可能)i(i种可能)i(i种可能),最后端要大于等于i(n−i+1种可能)i(n-i+1种可能)i(n−i+1种可能)
于是我们直接那两个数相乘然后乘上a[i]a[i]a[i]在求和即可
代码:
#include<cstdio>
using namespace std;
long long n,a,ans;
int main()
{scanf("%ld",&n);for (long long i=1;i<=n;++i){scanf("%lld",&a);ans=(ans+a*i*(n-i+1))%1000000007;//出现次数乘a再求和}printf("%lld",ans);
}