对于每个元素,考虑其贡献 假设下标从 00 开始 第i 个元素为第1个的子数组数量为:n−i个 第 i 个元素为第2个的子数组的数量为n−(i−1)−1=n−i个
第 i 个元素为第3个的子数组的数量为n−(i−2)−2=n−i个
第 i个元素为第j个的子数组的数量为n−(i−(j−1))−(j−1)=n−i 个
最多是有(i+1)个,即j≤i+1
第 i 个元素的总贡献为:
$(n-i)\times 1\times b[i]+(n-i)\times 2\times b[i]+...+(n-i)\times (i+1)\times b[i]=(n-i)\times b[i]\times (i+2)\times (i+1)\times 2$
时间复杂度:O(n)
C++
#include <iostream>
using namespace std;
int main()
{
    int mod = 1e9 + 7;
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        long long cnt = 1ll * (i + 1) * (i + 2) / 2 % mod;
        ans = (ans + 1ll * (n - i) * x % mod * cnt % mod) % mod;
    }
    cout << ans << "\n";
    return 0;
}
Java
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Solution3 s = new Solution3();
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int j = 0; j < n; j++) {
            arr[j] = sc.nextInt();
        }
        System.out.println(s.subWeightedSum(arr));
    }
}
class Solution3 {
    public static long mod = (long)1e9 + 7;
    public int subWeightedSum(int[] arr) {
        int n = arr.length;
        long cnt = 0;
        for(int i = 0; i < n; i++) {
            long curSum = (i + 1) * (long)(i + 2) / 2 % mod;
            cnt += arr[i]% mod * (n - i)% mod * curSum % mod;
            cnt = cnt % mod;
        }
        return (int)cnt;
    }
}
Python
n = int(input())
w = list(map(int,input().split()))
mod = 10**9+7
res = 0
for i in range(n):
    l = i + 1
    r = n - i
    cnt = ((l + 1) * l // 2) * r % mod
    res = (res + cnt * w[i] % mod) % mod
print(res)
        小红有一个长度为 n 的数组 a ,下标从 1 开始。
他对这个数组的权值定义为:$1\times a_1+2\times a_2 + 3\times a_3 + \cdots + n\times a_n$
现在小红想要问你,这个数组的所有连续子数组的权值之和是多少。
第一行,一个整数 n(1≤n≤105),表示数组的长度。
第二行,n 个整数,第 i 个整数为 ai(1≤ai≤109) 。
一个非负整数,表示所有子数组的权值之和,答案对 109+7 取模
输入
3
1 2 3
输出
33
说明
对于子数组 a[1] 来说,权值为 1
对于子数组 a[2] 来说,权值为 2
对于子数组 a[3] 来说,权值为 3
对于子数组 a[1,2] 来说,权值为 5
对于子数组 a[2,3] 来说,权值为 8
对于子数组 a[1,2,3] 来说,权值为 14
总和为 33 。