经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
洛谷P1226 【模板】快速幂
来源:cnblogs  作者:Tomorrowland_D  时间:2024/8/7 9:40:16  对本文有异议

1.快速幂模板

前置知识

一个数字n,它的二进制位数一定是log2n向下取整+1;

快速幂模板代码

这段代码实现了快速幂算法(Exponentiation by squaring),用来计算 ( an ) 的值,其中 ( a ) 和 ( n ) 都是整数。

  1. int quickpow(int a, int n)
  2. {
  3. int res = 1; // 初始化结果为1,因为任何数的0次幂都是1
  4. while (n) { // 当指数n不为0时,继续执行循环
  5. if (n & 1) // 如果n的最低位为1(即n是奇数)
  6. res = res * a; // 将当前底数a乘到结果中
  7. a = a * a; // 将底数a平方,相当于底数翻倍,指数减半
  8. n >>= 1; // 将指数n右移一位,相当于将指数减半
  9. }
  10. return res; // 返回计算结果
  11. }

现在逐句解析每一行代码的作用:

  1. int res = 1;

    • 初始化变量 res 为1,这是最终结果的初始值。任何数的0次幂都是1。
  2. while (n) {

    • 进入一个循环,条件是当指数 n 不为0时继续执行。循环将持续执行直到 n 变为0。
  3. if (n & 1)

    • 判断当前的指数 n 是否为奇数,使用位运算 n & 1 来判断。如果 n 的最低位(即最右边的二进制位)为1,则说明 n 是奇数。
  4. res = res * a;

    • 如果 n 是奇数,则将当前的底数 a 乘到结果 res 中。这步实现了快速幂算法中的乘法操作。
  5. a = a * a;

    • 然后将底数 a 自乘,即 a 变成 a^2。这一步相当于将底数翻倍,对应于指数减半的操作。
  6. n >>= 1;

    • 将指数 n 右移一位,即 n 变成 n / 2。这一步实现了快速幂算法中的指数减半操作。
  7. 循环回到第2步,直到 n 变为0,退出循环。

  8. return res;

    • 返回最终计算得到的结果 res,即底数 a 的指数 n 次幂的值。

这段代码利用了快速幂算法的思想,通过迭代和位运算的方式,将指数的计算复杂度从 ( O(n) ) 优化到 ( O(log n) ),显著提高了计算效率。

快速幂算法的形象解释

快速幂算法的例题

【模板】快速幂

题目描述

给你三个整数 \(a,b,p\),求 \(a^b \bmod p\)

输入格式

输入只有一行三个整数,分别代表 \(a,b,p\)

输出格式

输出一行一个字符串 a^b mod p=s,其中 \(a,b,p\) 分别为题目给定的值, \(s\) 为运算结果。

样例 #1

样例输入 #1

  1. 2 10 9

样例输出 #1

  1. 2^10 mod 9=7

提示

样例解释

\(2^{10} = 1024\)\(1024 \bmod 9 = 7\)

数据规模与约定

对于 \(100\%\) 的数据,保证 \(0\le a,b < 2^{31}\)\(a+b>0\)\(2 \leq p \lt 2^{31}\)

答案

这题直接套用快速幂算法的模板,只需要每一步我们加上取模运算即可,注意数据需要开long long类型

  1. #include<iostream>
  2. using namespace std;
  3. long long quickpow(long long a, long long n,long long p)
  4. {
  5. long long res = 1;
  6. while (n) {
  7. if (n & 1) res = (res * a)%p;
  8. a = (a * a)%p;
  9. n >>= 1;
  10. }
  11. return res;
  12. }
  13. int main()
  14. {
  15. long long a, b, p;
  16. cin >> a >> b >> p;
  17. printf("%lld^%lld mod %lld=%lld", a, b, p, quickpow(a, b, p));
  18. return 0;
  19. }

原文链接:https://www.cnblogs.com/Tomorrowland/p/18346407

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号