小R的雪球滚落计算

问题描述

        在一座高度为 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++实现

问题理解

  1. 输入

    • H:山的高度。
    • x:膨胀系数。
    • a:一个长度为 H 的数组,a[i] 表示在海拔高度 i 处生成的雪球数量。
  2. 输出

    • 所有雪球滚落到地面的总体积,并对结果取模 10^9 + 7

关键点

  • 每个雪球从海拔 i 滚到地面时,体积会膨胀 x^i 倍。
  • 我们需要计算所有雪球的总体积,并对结果取模 10^9 + 7

解题思路

  1. 遍历每个海拔高度

    • 对于每个海拔高度 i,计算该高度处所有雪球的总体积。
    • 体积膨胀 x^i 倍,因此总体积为 a[i] * x^i
  2. 累加总体积

    • 将每个海拔高度的总体积累加起来。
  3. 取模运算

    • 在累加过程中,每次累加后都要对 10^9 + 7 取模,以防止溢出。

数据结构选择

  • 使用一个变量来累加总体积。
  • 使用一个变量来存储当前的膨胀系数 x^i

算法步骤

  1. 初始化一个变量 total_volume 为 0,用于存储总体积。
  2. 初始化一个变量 current_power 为 1,用于存储当前的膨胀系数 x^i
  3. 从海拔高度 0 到 H-1 遍历:
    • 计算当前海拔高度处的总体积:a[i] * current_power
    • 将计算结果累加到 total_volume,并对 10^9 + 7 取模。
    • 更新 current_power 为 current_power * x,并对 10^9 + 7 取模。
  4. 返回 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−1​ai​⋅xi。我们需要在计算过程中对结果取模 10^9+7,以避免数值溢出。

解题过程

  1. 初始化变量

    • mod 设置为 10^9+7,用于取模运算。
    • mul 初始化为 1,表示当前高度的膨胀倍数。
    • ans 初始化为 0,用于累加总体积。
  2. 遍历每个高度

    • 对于每个高度 i,计算当前高度的膨胀倍数 mul,即 mul = mul * x % mod
    • 将当前高度的雪球数量 a[i] 乘以膨胀倍数 mul,并累加到 ans 中,即 ans = (ans + a[i] * mul) % mod
  3. 返回结果

    • 最终返回 ans,即所有雪球滚落到地面的总体积。

复杂度分析

  • 时间复杂度:O(H),其中 H 是山的高度。我们只需要遍历一次高度数组 a,每次计算膨胀倍数和累加体积的时间复杂度为 O(1)。
  • 空间复杂度:O(1),除了输入数组 a 外,我们只使用了常数个额外的变量。

知识点扩展

  • 模运算:在处理大数问题时,模运算可以避免数值溢出。本题中,我们使用模 109+7 来确保结果在合理范围内。
  • 动态规划:虽然本题没有显式使用动态规划,但通过逐步累加体积的方式,可以看作是一种动态规划的思想。
  • 数学建模:本题的核心在于理解雪球体积的膨胀规律,并将其转化为数学表达式 ∑i=0H−1​ai​⋅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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值