《小R的权值计算》 | 豆包MarsCode AI刷题

109 阅读2分钟

小R想出了一个很有意思的计算方法。他定义了一个长度为mm的数组bb的权值计算方式,就像是一个小魔法公式:1×b1+2×b2+3×b3++m×bm1×b_1 + 2×b_2+3×b_3 + \cdots + m×b_m

现在呢,小R有一个长度为nn的数组aa,他就像个好奇宝宝一样,想知道从这个数组aa里能取出来的所有子数组按照这个魔法公式算出来的权值总和是多少。而且呀,这个总和还得对109+710^9 + 7取个模,就像是给这个总和穿上了一件特制的“衣服”。

测试样例就像小谜题:

  1. 样例1: - 输入是n=3n = 3a=[1,2,3]a = [1, 2, 3]。这就好比给了你三个小玩具,分别标着1、2、3。你得按照小R的魔法公式去算一算所有可能的组合的权值总和。最后算出来的结果是3333。这就像你把这些玩具按照规则摆弄了一番,得出了一个有趣的数字。
  2. 样例2: - 输入变成了n=4n = 4a=[4,5,6,7]a = [4, 5, 6, 7]。这次玩具变多了,有四个。你再去算一算,最后得到的结果是203203。这就像是在玩一个更复杂的玩具组合游戏。
  3. 样例3: - 输入是n=2n = 2a=[10,20]a = [10, 20]。只有两个大玩具了。按照规则摆弄后,得到的结果是8080

解题思路就像探索宝藏的路线:

  1. 理解子数组:首先得清楚什么是子数组。子数组就像是从原数组这个“大蛋糕”上切下来的一块“小蛋糕”,而且这块“小蛋糕”得是连续的。
  2. 计算子数组权值:对于每一块切下来的“小蛋糕”(子数组),都得按照小R的魔法公式去算权值。这个计算过程如果一个一个硬算,那就像用手一颗一颗数沙子,太累了。所以我们可以用一些巧妙的方法,比如前缀和。
  3. 枚举子数组:我们可以用两层循环来像个勤劳的小蜜蜂一样,把所有可能的子数组都找出来。外层循环就像在找从哪里开始切“蛋糕”,内层循环则是决定切到哪里结束。 下面是用Python写的代码,就像是一把打开宝藏的钥匙:
MOD = 10**9 + 7 
def calculate_weight(n, a): 
    total_weight = 0 
    for start in range(n): 
        subarray_sum = 0 
        for end in range(start, n): 
            subarray_sum += a[end] 
            weight = 0 
            for k in range(start, end + 1): 
                weight += (k - start + 1) * a[k] 
            total_weight += weight 
            total_weight %= MOD 
     return total_weight

你看,通过这样的代码,我们就能像个聪明的小魔法师一样,算出所有子数组的权值总和啦!每个测试样例就像是一个小关卡,用这个方法都能轻松闯过哦!