C++如何求解大林计算(快速幂取模算法)

阿宇姑娘_9394

阿宇姑娘_9394

2026-07-08

569人浏览

原创

“大林计算”是民间对快速幂取模的误称,实际指高效计算a^b % m的算法,时间复杂度o(log b),核心为二进制拆分与模运算结合,需注意数据类型、取模时机及边界处理。

c++如何求解大林计算(快速幂取模算法)

什么是大林计算?先说清楚命名误区

“大林计算”不是标准术语,实际是民间对 快速幂取模(即 powmod 或 modular exponentiation)的误传或戏称。它解决的是形如 a^b % m 的问题——当 b 很大(比如 10¹⁸)时,直接算 a^b 会溢出甚至超时。

核心思路是:利用幂的二进制拆分 + 模运算分配律,把时间复杂度从 O(b) 降到 O(log b)。

手写快速幂取模的正确写法(C++)

别依赖 std::pow,它不支持取模,且对整数精度不保证;也别用递归版本(栈可能爆)。推荐迭代写法,安全、清晰、易调试:

long long powmod(long long a, long long b, long long m) {
    if (m == 1) return 0; // 特殊情况:任何数 % 1 都是 0
    long long res = 1;
    a %= m; // 先取模,防 a >= m 导致后续乘法溢出
    while (b > 0) {
        if (b & 1) res = (res * a) % m; // b 的当前位是 1,累乘 a^(2^k)
        a = (a * a) % m; // 平方底数,对应下一位
        b >>= 1;
    }
    return res;
}
  • a、b、m 都要用 long long,尤其 m 可能接近 INT_MAX,中间乘法 (res * a) 会超 int
  • 每次乘法后立刻 % m,否则即使 long long 也可能溢出(比如 m ≈ 1e9,a ≈ 1e9,则 a*a ≈ 1e18,刚好卡在 long long 上限附近)
  • 必须先做 a %= m,否则若 a 本身已超 m,第一次平方就可能溢出

常见错误现象和坑点

你写的代码返回负数?结果突然变 0?跑样例对但交题 WA?大概率掉进下面这些坑:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • m 为 0 或负数:C++ 中 % 对负数取模行为未定义,务必确保 m > 0,且调用前校验
  • 没处理 b == 0:数学上 a^0 % m == 1 % m(m > 1 时为 1),但你的循环可能跳过,需确认 res 初始值是否合理(上面写法已覆盖)
  • 使用 int 类型传参:比如 powmod(123456789, 987654321, 1000000007),参数被截断成低 32 位,结果完全错误
  • 忘记 a %= m,而 a 是输入值(比如读入的 1e12),直接参与乘法导致第一次就溢出

什么时候该用快速幂取模?

不是所有幂运算都需要它。适用场景很明确:

  • 题目明确要求 “答案对 10^9+7 取模”,且指数 b ≥ 1e5
  • 涉及组合数、矩阵快速幂、线性递推(如斐波那契第 n 项)、RSA 加密等算法的底层运算
  • 需要多次调用,且 b 每次都不同——这时可考虑预处理幂表,但通常直接调用 powmod 更稳妥

如果 b 很小(比如 ),用普通循环反而更直观、不易出错;强行套快速幂反而增加理解和调试成本。

真正容易被忽略的是:**模数 m 是否为质数**——这不影响快速幂本身,但会影响后续是否能用费马小定理求逆元。快速幂只管算 a^b % m,别的事它不管。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习