小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
解题思路
- 理解问题:
- 题目要求计算所有雪球滚落到地面的总体积,并对结果取模
10^9 + 7。 - 每个高度
i处的雪球滚到地面时,体积会膨胀x^i倍。
- 题目要求计算所有雪球滚落到地面的总体积,并对结果取模
- 定义常量:
- 定义常量
MOD = 10**9 + 7,用于取模运算。
- 定义常量
- 快速幂算法:
- 定义一个函数
fast_pow(base, exponent, mod),用于计算base^exponent % mod。 - 使用迭代的方式,每次将指数
exponent右移一位(相当于整除 2),并将base平方并取模。如果exponent是奇数,则将result乘以base并取模。
- 定义一个函数
- 初始化总体积:
- 初始化变量
total_volume为 0,用于累加所有雪球的总体积。
- 初始化变量
- 遍历每个高度
i:- 使用
for循环遍历每个高度i,从 0 到H-1。
- 使用
- 计算每个高度
i处的雪球对总体积的贡献:- 使用
fast_pow计算x^i。 - 计算
a[i] * (x^i) % MOD,得到当前高度i处的雪球对总体积的贡献。
- 使用
- 累加贡献:
- 将每个高度的贡献累加到
total_volume中,并取模10^9 + 7,以确保结果不会溢出。
- 将每个高度的贡献累加到
- 返回结果:
- 返回计算得到的
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
步骤总结
- 定义常量:
- 定义常量
MOD = 10**9 + 7,用于取模运算。
- 定义常量
- 定义快速幂算法:
- 定义一个函数
fast_pow(base, exponent, mod),用于计算base^exponent % mod。 - 使用迭代的方式,每次将指数
exponent右移一位(相当于整除 2),并将base平方并取模。如果exponent是奇数,则将result乘以base并取模。
- 定义一个函数
- 初始化总体积:
- 初始化变量
total_volume为 0,用于累加所有雪球的总体积。
- 初始化变量
- 遍历每个高度
i:- 使用
for循环遍历每个高度i,从 0 到H-1。
- 使用
- 计算每个高度
i处的雪球对总体积的贡献:- 使用
fast_pow计算x^i。 - 计算
a[i] * (x^i) % MOD,得到当前高度i处的雪球对总体积的贡献。
- 使用
- 累加贡献:
- 将每个高度的贡献累加到
total_volume中,并取模10^9 + 7,以确保结果不会溢出。
- 将每个高度的贡献累加到
- 返回结果:
- 返回计算得到的
total_volume。
- 返回计算得到的
知识总结:
- 快速幂算法:用于高效计算幂运算。
- 定义:快速幂算法是一种用于高效计算幂运算的算法,时间复杂度为
O(log exponent)。 - 实现:通过迭代的方式,每次将指数
exponent右移一位(相当于整除 2),并将base平方并取模。如果exponent是奇数,则将result乘以base并取模。
- 定义:快速幂算法是一种用于高效计算幂运算的算法,时间复杂度为
- 取模运算:防止整数溢出。
- 定义:取模运算用于防止整数溢出,特别是在处理大数时。
- 应用:在每次乘法和加法操作后,对结果取模
10^9 + 7,以确保结果不会溢出。
- 循环遍历:遍历数组并计算每个高度的贡献。
- 定义:使用
for循环遍历每个高度i,计算每个高度i处的雪球对总体积的贡献。 - 应用:遍历数组
a,计算每个高度i处的雪球对总体积的贡献,并累加到total_volume中。
- 定义:使用
- 函数定义与调用:定义和调用函数来实现功能。
- 定义:定义一个函数
solution,用于计算所有雪球滚落到地面的总体积。 - 调用:在
main函数中调用solution函数,并打印结果。
- 定义:定义一个函数
- 变量与常量:定义和使用变量与常量来存储和处理数据。
- 定义:定义常量
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)