每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)

[洛谷 P1226] 快速幂求模题解

📌 题目链接

https://www.luogu.com.cn/problem/P1226

📝 题目描述

给定正整数 ab 和质数 p,要求计算:

复制代码
a^b % p

其中:

  • 1 ≤ a ≤ 10^9
  • 0 ≤ b ≤ 10^9
  • 2 ≤ p ≤ 10^9

💡 解题思路

1. 直接计算不可行

由于 b 的范围可达 10^9,直接计算 a^b 会导致结果过大,无法在常规数据类型中存储。因此,需要一种高效的算法来计算 a^b % p

2. 快速幂算法

快速幂算法(Exponentiation by Squaring)是一种高效计算大整数幂模的方法。其基本思想是利用二进制分解,将指数 b 转换为二进制形式,然后通过平方和乘法的方式快速计算幂值。

快速幂的递推关系:
  • b 为偶数时:a^b = (a^(b/2))^2
  • b 为奇数时:a^b = a * (a^(b-1))

通过不断将 b 右移一位(即除以 2),并根据 b 的奇偶性决定是否乘上当前的 a,可以在对数时间内计算出结果。

3. 模运算优化

在计算过程中,每一步都对结果取模 p,以避免中间结果溢出,并确保最终结果满足题目要求。

💻 代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

long long a, b, p;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> a >> b >> p;
    cout << a << "^" << b << " mod " << p << "=";
    
    long long ans = 1;
    a = a % p; // 防止 a 大于 p
    
    while (b) {
        if (b & 1) { // 如果 b 是奇数
            ans = ans * a % p;
        }
        a = a * a % p; // a^2 mod p
        b >>= 1; // b 右移一位,相当于 b /= 2
    }
    
    cout << ans;
    return 0;
}

🧩 代码解析

  1. 输入处理 :使用 cin 读取输入,abp 分别表示底数、指数和模数。

  2. 初始化 :将 ans 初始化为 1,用于存储最终结果。为了防止中间结果过大,先对 a 取模 p

  3. 快速幂循环

    • b 不为 0 时,进入循环。
    • 如果 b 是奇数(即 b & 1 为真),则将当前的 a 乘到 ans 上,并对 p 取模。
    • a 自身平方,并对 p 取模。
    • b 右移一位,相当于将 b 除以 2。
  4. 输出结果:输出计算结果。

⏱️ 时间复杂度分析

快速幂算法的时间复杂度为 O(log b),其中 b 是指数。由于每次循环将 b 减半,因此循环次数为 log b。在每次循环中,进行常数次的乘法和取模操作,因此总时间复杂度为 O(log b)

🔚 总结

通过使用快速幂算法,可以在对数时间内计算大整数的幂模,避免了直接计算可能导致的溢出问题。该算法在处理大规模数据时非常高效,是解决此类问题的常用技巧。

相关推荐
hh随便起个名7 分钟前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
橘子真甜~9 分钟前
C/C++ Linux网络编程15 - 网络层IP协议
linux·网络·c++·网络协议·tcp/ip·计算机网络·网络层
Dingdangcat861 小时前
城市交通多目标检测系统:YOLO11-MAN-FasterCGLU算法优化与实战应用_3
算法·目标检测·目标跟踪
asiwxy2 小时前
OpenGL 材质
c++
阿华hhh2 小时前
Linux系统编程(标准io)
linux·开发语言·c++
tang&2 小时前
滑动窗口:双指针的优雅舞步,征服连续区间问题的利器
数据结构·算法·哈希算法·滑动窗口
拼命鼠鼠2 小时前
【算法】矩阵链乘法的动态规划算法
算法·矩阵·动态规划
LYFlied2 小时前
【每日算法】LeetCode 17. 电话号码的字母组合
前端·算法·leetcode·面试·职场和发展
程序喵大人3 小时前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
式5163 小时前
线性代数(八)非齐次方程组的解的结构
线性代数·算法·机器学习