接下来介绍贡献法。
顾名思义,贡献法即考虑每个元素对最终答案的贡献。
那么在上述问题中,每个元素给最终答案的贡献是多少呢?是包含该元素的子数组个数。
考虑下标为 i 的元素,共有多少个子数组包含该元素呢?
这是一个分步乘法问题。首先考虑所有可能的左端点,可取 0, 1, 2, ..., i,共 (i + 1) 个;然后考虑所有可能的右端点,可取 i, i + 1, i + 2, ..., n - 1,共 (n - i) 个,所以当前元素的贡献为:
(i + 1) * (n - i) * v[i] 。
参考代码:

注意这里需要开 unsigned long long,因为我构造了一组测试数据来卡 long long。
尽管 long long 溢出不太常见,但还是要提防。