一.题目: 小R定义了一个长度为 m 的数组 b 的权值为:1×b_1 + 2×b_2 + 3×b_3 + ... + m×b_m。
现在小R有一个长度为 n 的数组 a,她想知道所有子数组的权值和是多少,并且答案需要对 10^9 + 7 取模。
测试样例
样例1:
输入:
n = 3, a = [1, 2, 3]
输出:33
样例2:
输入:
n = 4, a = [4, 5, 6, 7]
输出:203
样例3:
输入:
n = 2, a = [10, 20]
输出:80
二.解题思路
- 子数组的定义:对于一个长度为
n的数组a,其子数组可以是任意长度的连续子序列。 - 权值的计算:对于每个子数组
b,其权值为1×b_1 + 2×b_2 + 3×b_3 + ... + m×b_m。 - 总权值的计算:我们需要计算所有可能子数组的权值和。
三.编写代码:
def solution(n: int, a: list) -> int:
MOD = 10**9 + 7
total_weight = 0
# 遍历所有可能的子数组
for start in range(n):
current_weight = 0
for end in range(start, n):
# 更新当前子数组的权值
current_weight += (end - start + 1) * a[end]
total_weight = (total_weight + current_weight) % MOD
return total_weight
if __name__ == '__main__':
print(solution(3, [1, 2, 3]) == 33)
print(solution(4, [4, 5, 6, 7]) == 203)
print(solution(2, [10, 20]) == 80)
四. 关键步骤解释
- 遍历所有子数组:我们使用两个嵌套循环来遍历所有可能的子数组。
start是子数组的起始位置,end是子数组的结束位置。 - 计算当前子数组的权值:对于每个子数组
a[start:end+1],我们计算其权值并累加到total_weight中。 - 取模操作:每次累加权值时,我们都对结果取模
10^9 + 7,以防止溢出。