对于每个元素,考虑其贡献 假设下标从 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)×1×b[i]+(n−i)×2×b[i]+...+(n−i)×(i+1)×b[i]=(n−i)×b[i]×(i+2)×(i+1)×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×a1+2×a2+3×a3+⋯+n×an
现在小红想要问你,这个数组的所有连续子数组的权值之和是多少。
第一行,一个整数 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 。