问题描述
在一座高度为 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
C++实现
问题理解
-
输入:
H
:山的高度。x
:膨胀系数。a
:一个长度为H
的数组,a[i]
表示在海拔高度i
处生成的雪球数量。
-
输出:
- 所有雪球滚落到地面的总体积,并对结果取模
10^9 + 7
。
- 所有雪球滚落到地面的总体积,并对结果取模
关键点
- 每个雪球从海拔
i
滚到地面时,体积会膨胀x^i
倍。 - 我们需要计算所有雪球的总体积,并对结果取模
10^9 + 7
。
解题思路
-
遍历每个海拔高度:
- 对于每个海拔高度
i
,计算该高度处所有雪球的总体积。 - 体积膨胀
x^i
倍,因此总体积为a[i] * x^i
。
- 对于每个海拔高度
-
累加总体积:
- 将每个海拔高度的总体积累加起来。
-
取模运算:
- 在累加过程中,每次累加后都要对
10^9 + 7
取模,以防止溢出。
- 在累加过程中,每次累加后都要对
数据结构选择
- 使用一个变量来累加总体积。
- 使用一个变量来存储当前的膨胀系数
x^i
。
算法步骤
- 初始化一个变量
total_volume
为 0,用于存储总体积。 - 初始化一个变量
current_power
为 1,用于存储当前的膨胀系数x^i
。 - 从海拔高度
0
到H-1
遍历:- 计算当前海拔高度处的总体积:
a[i] * current_power
。 - 将计算结果累加到
total_volume
,并对10^9 + 7
取模。 - 更新
current_power
为current_power * x
,并对10^9 + 7
取模。
- 计算当前海拔高度处的总体积:
- 返回
total_volume
。
代码实现
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int MOD = 1e9 + 7;
// 快速幂算法,计算 base^exp % MOD
long long fastPow(long long base, int exp) {
long long result = 1;
while (exp > 0) {
if (exp % 2 == 1) {
result = (result * base) % MOD;
}
base = (base * base) % MOD;
exp /= 2;
}
return result;
}
int solution(int H, int x, vector<int>& a) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
long long totalVolume = 0;
for (int i = 0; i < H; ++i) {
// 计算每个高度 i 处的雪球滚落到地面的总体积
long long volume = (a[i] * fastPow(x, i + 1)) % MOD;
totalVolume = (totalVolume + volume) % MOD;
}
return totalVolume;
}
int main() {
vector<int> a1 = {1, 3, 2, 4};
cout << (solution(4, 5, a1) == 2830) << endl;
vector<int> a2 = {1, 2};
cout << (solution(2, 5, a2) == 55) << endl;
vector<int> a3 = {2, 1, 1};
cout << (solution(3, 3, a3) == 42) << endl;
}
Python实现
思路说明
题目要求计算所有雪球滚落到地面的总体积,并对结果取模 10^9+7。每个雪球从海拔高度 i
滚到地面时,体积会膨胀 xi 倍。因此,总体积可以表示为 ∑i=0H−1ai⋅xi。我们需要在计算过程中对结果取模 10^9+7,以避免数值溢出。
解题过程
-
初始化变量:
mod
设置为 10^9+7,用于取模运算。mul
初始化为 1,表示当前高度的膨胀倍数。ans
初始化为 0,用于累加总体积。
-
遍历每个高度:
- 对于每个高度
i
,计算当前高度的膨胀倍数mul
,即mul = mul * x % mod
。 - 将当前高度的雪球数量
a[i]
乘以膨胀倍数mul
,并累加到ans
中,即ans = (ans + a[i] * mul) % mod
。
- 对于每个高度
-
返回结果:
- 最终返回
ans
,即所有雪球滚落到地面的总体积。
- 最终返回
复杂度分析
- 时间复杂度:O(H),其中 H 是山的高度。我们只需要遍历一次高度数组
a
,每次计算膨胀倍数和累加体积的时间复杂度为 O(1)。 - 空间复杂度:O(1),除了输入数组
a
外,我们只使用了常数个额外的变量。
知识点扩展
- 模运算:在处理大数问题时,模运算可以避免数值溢出。本题中,我们使用模 109+7 来确保结果在合理范围内。
- 动态规划:虽然本题没有显式使用动态规划,但通过逐步累加体积的方式,可以看作是一种动态规划的思想。
- 数学建模:本题的核心在于理解雪球体积的膨胀规律,并将其转化为数学表达式 ∑i=0H−1ai⋅xi。
代码实现
def solution(H:int,x:int,a:list) -> int:
assert H == len(a)
mod = 10 ** 9 + 7
mul = 1
ans = 0
for v in a:
mul = mul * x % mod
ans = (ans + v * mul) % mod
return ans
if __name__ == '__main__':
print(solution(H = 4, x = 5, a = [1, 3, 2, 4]) == 2830)
print(solution(H = 2, x = 5, a = [1, 2]) == 55)
print(solution(H = 3, x = 3, a = [2, 1, 1]) == 42)