小R的雪球滚落计算 | 豆包MarsCode AI 刷题

131 阅读6分钟

小R的雪球滚落计算 | 豆包MarsCode AI 刷题

问题描述

在一座高度为 H 的山上,每个高度 i 处生成了 a_i 个雪球。当雪球从海拔高度 i 滚到地面时,它的体积会膨胀 x^i 倍。也就是说,雪球的初始体积为 1,滚动距离 i 会使体积变成 1 * x^i。我们需要计算所有滚落到地面的雪球的总体积,并对结果取模 10^9 + 7

你的任务是帮助计算所有雪球滚落到地面的总体积。


测试样例

样例1:

输入:H = 4, x = 5, a = [1, 3, 2, 4] 输出:2830

样例2:

输入:H = 2, x = 5, a = [1, 2] 输出:55

样例3:

输入:H = 3, x = 3, a = [2, 1, 1] 输出:42

解题思路


  1. 理解问题
    • 题目要求计算所有雪球滚落到地面的总体积,并对结果取模 10^9 + 7
    • 每个高度 i 处的雪球滚到地面时,体积会膨胀 x^i 倍。
  2. 定义常量
    • 定义常量 MOD = 10**9 + 7,用于取模运算。
  3. 快速幂算法
    • 定义一个函数 fast_pow(base, exponent, mod),用于计算 base^exponent % mod
    • 使用迭代的方式,每次将指数 exponent 右移一位(相当于整除 2),并将 base 平方并取模。如果 exponent 是奇数,则将 result 乘以 base 并取模。
  4. 初始化总体积
    • 初始化变量 total_volume 为 0,用于累加所有雪球的总体积。
  5. 遍历每个高度 i
    • 使用 for 循环遍历每个高度 i,从 0 到 H-1
  6. 计算每个高度 i 处的雪球对总体积的贡献
    • 使用 fast_pow 计算 x^i
    • 计算 a[i] * (x^i) % MOD,得到当前高度 i 处的雪球对总体积的贡献。
  7. 累加贡献
    • 将每个高度的贡献累加到 total_volume 中,并取模 10^9 + 7,以确保结果不会溢出。
  8. 返回结果
    • 返回计算得到的 total_volume

代码详解


1.定义常量 MOD

定义常量 MOD = 10**9 + 7,用于取模运算。

MOD = 10**9 + 7

2.定义快速幂算法 fast_pow

定义一个函数 fast_pow(base, exponent, mod),用于计算 base^exponent % mod。使用迭代的方式,每次将指数 exponent 右移一位(相当于整除 2),并将 base 平方并取模。如果 exponent 是奇数,则将 result 乘以 base 并取模。

def fast_pow(base, exponent, mod):
    result = 1
    while exponent > 0:
        if exponent % 2 == 1:
            result = (result * base) % mod
        base = (base * base) % mod
        exponent //= 2
    return result

3.初始化 total_volume

初始化变量 total_volume 为 0,用于累加所有雪球的总体积。

total_volume = 0

4.遍历每个高度 i

使用 for 循环遍历每个高度 i,从 0 到 H-1

for i in range(H):

5.计算每个高度 i 处的雪球对总体积的贡献

使用 fast_pow 计算 x^i。计算 a[i] * (x^i) % MOD,得到当前高度 i 处的雪球对总体积的贡献。

contribution = a[i] * fast_pow(x, i, MOD) % MOD

6.累加贡献

total_volume = (total_volume + contribution) % MOD

7.返回结果

return total_volume

步骤总结

  1. 定义常量
    • 定义常量 MOD = 10**9 + 7,用于取模运算。
  2. 定义快速幂算法
    • 定义一个函数 fast_pow(base, exponent, mod),用于计算 base^exponent % mod
    • 使用迭代的方式,每次将指数 exponent 右移一位(相当于整除 2),并将 base 平方并取模。如果 exponent 是奇数,则将 result 乘以 base 并取模。
  3. 初始化总体积
    • 初始化变量 total_volume 为 0,用于累加所有雪球的总体积。
  4. 遍历每个高度 i
    • 使用 for 循环遍历每个高度 i,从 0 到 H-1
  5. 计算每个高度 i 处的雪球对总体积的贡献
    • 使用 fast_pow 计算 x^i
    • 计算 a[i] * (x^i) % MOD,得到当前高度 i 处的雪球对总体积的贡献。
  6. 累加贡献
    • 将每个高度的贡献累加到 total_volume 中,并取模 10^9 + 7,以确保结果不会溢出。
  7. 返回结果
    • 返回计算得到的 total_volume

知识总结:


  1. 快速幂算法:用于高效计算幂运算。
    • 定义:快速幂算法是一种用于高效计算幂运算的算法,时间复杂度为 O(log exponent)
    • 实现:通过迭代的方式,每次将指数 exponent 右移一位(相当于整除 2),并将 base 平方并取模。如果 exponent 是奇数,则将 result 乘以 base 并取模。
  2. 取模运算:防止整数溢出。
    • 定义:取模运算用于防止整数溢出,特别是在处理大数时。
    • 应用:在每次乘法和加法操作后,对结果取模 10^9 + 7,以确保结果不会溢出。
  3. 循环遍历:遍历数组并计算每个高度的贡献。
    • 定义:使用 for 循环遍历每个高度 i,计算每个高度 i 处的雪球对总体积的贡献。
    • 应用:遍历数组 a,计算每个高度 i 处的雪球对总体积的贡献,并累加到 total_volume 中。
  4. 函数定义与调用:定义和调用函数来实现功能。
    • 定义:定义一个函数 solution,用于计算所有雪球滚落到地面的总体积。
    • 调用:在 main 函数中调用 solution 函数,并打印结果。
  5. 变量与常量:定义和使用变量与常量来存储和处理数据。
    • 定义:定义常量 MOD 用于取模运算,定义变量 total_volume 用于累加总体积。
    • 应用:在计算过程中使用这些变量和常量。

这道题的核心在于理解雪球体积膨胀的规律,并使用快速幂算法高效计算幂运算。通过遍历每个高度,计算每个高度的贡献并累加,最终得到所有雪球滚落到地面的总体积,并对结果取模 10^9 + 7

学习计划:


1.定期刷题:每天至少一道算法题,思考如何在第一步的基础上,如何优化算法,降低时间复杂度。

2.错题总结:总结一下这道题考察的知识点、切入的角度、同类型的题目等,还要思考有没有更优的办法,代码还能不能更加简洁一些。

工具运用:


豆包MarsCode AI提供了详细的解题思路和代码示例。

向豆包提出问题,可以获得思路启发,便于我们更好的理解和把握如何运用算法去解题。

针对代码中可能出现的语法错误,逻辑漏洞等问题,可以帮忙检查出并给出修改建议,提升代码的准确率和效率

在解完算法题后,可以帮你回顾题目中涉及到的算法知识,数据结构知识等,强化你对这些知识点的掌握程度。并且为你拓展相关的,更深入或者更广泛的算法知识内容,拓展知识面,更好的应对更多类型的算法题。

完整代码实现


def solution(H: int, x: int, a: list) -> int:
    MOD = 10**9 + 7
    total_volume = 0
    
    # 快速幂算法
    def fast_pow(base, exponent, mod):
        result = 1
        while exponent > 0:
            if exponent % 2 == 1:
                result = (result * base) % mod
            base = (base * base) % mod
            exponent //= 2
        return result
    
    # 遍历每个高度 i
    for i in range(H):
        # 计算每个高度 i 处的雪球对总体积的贡献
        # 使用快速幂算法计算 x^i
        contribution = a[i] * fast_pow(x, i, MOD) % MOD
        total_volume = (total_volume + contribution) % MOD
    print(total_volume)
    return total_volume

if __name__ == '__main__':
    print(solution(4, 5, [1, 3, 2, 4]) == 2830)
    print(solution(2, 5, [1, 2]) == 55)
    print(solution(3, 3, [2, 1, 1]) == 42)