题解:洛谷 AT_abc440_a Octave

【题目来源】

洛谷:AT_abc440_a [ABC440A] Octave - 洛谷

【题目描述】

音高每增加 \(1\) 个八度,声音的频率就增加一倍。

如果把频率为 \(X\) 赫兹的声音的音高提高 \(Y\) 个八度,那么它的频率将是多少赫兹?

【输入】

输入以标准输入的形式给出,格式如下:

\(X \ Y\)

【输出】

在一行中以整数形式输出答案。省略单位(赫兹)。

【输入样例】

110 2

【输出样例】

440

【核心思想】

  1. 问题分析:给定频率 \(X\) 赫兹,音高提高 \(Y\) 个八度,每个八度频率翻倍。求最终频率。这是一个简单幂运算问题,核心在于理解"翻倍 \(Y\) 次"的数学含义。

  2. 算法选择

    • 循环翻倍:将 \(X\) 连续乘以 \(2\)\(Y\) 次,或直接计算 \(X \times 2^Y\)
  3. 关键步骤

    • 读入数据\(X\)\(Y\)
    • 计算结果\(ans = X \times 2^Y\)
    • 输出结果\(ans\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(Y)\),循环 \(Y\) 次;或用快速幂 \(O(\log Y)\)
    • 空间复杂度:\(O(1)\)
  5. 幂运算与翻倍的核心思想

    • 指数增长的物理意义:每增加一个八度,频率变为原来的 \(2\) 倍。\(Y\) 个八度即 \(2^Y\) 倍,这是音乐理论中的基本关系
    • 循环与位运算的等价性\(X \times 2^Y\) 可用循环实现(代码方式),也可用位运算 X << Y 实现(当 \(X\)\(Y\) 较小时),或用快速幂实现(当 \(Y\) 较大时)
    • 整数溢出的注意:若 \(Y\) 较大,\(X \times 2^Y\) 可能超出 int 范围。题目未给数据范围,代码中使用 int 可能在极端情况下溢出,实际应使用 long long
    • 适用于基础数学运算、物理公式模拟类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int x, y;
int main()
{
    cin >> x >> y;
    for (int i = 1; i <= y; i++) {
        x *= 2;  // 将x乘以2
    }
    cout << x << endl;
    return 0;
}

【运行结果】

110 2
440
posted @ 2026-08-27 11:05  团爸讲算法  阅读(7)  评论(0)    收藏  举报