题目链接:hdu 5086 Revenge of Segment Tree
题目大意:给定一个序列,现在定义任意子序列的和为该子序列的权值,求所有子序列的权值和。
解题思路:计算每个位置上的数属于多少个子序列(线段),第i个数属于的线段数为i∗(n−i+1),i为左端点l可以选择的方案,(n-i+1)为右端点可以选择的方案数,乘法原理。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 447005;
const ll mod = 1e9+7;
int N;
ll A[maxn];
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &N);
for (int i = 1; i <= N; i++)
scanf("%I64d", &A[i]);
ll ans = 0;
for (int i = 1; i <= N; i++)
ans = (ans + (A[i] * i) % mod * (N-i+1)) % mod;
printf("%I64d\n", ans);
}
return 0;
}