思路:对b用二进制表示,分开操作防止溢出。
对b用二进制表示:
b = b 0 ∗ 2 0 + b 1 ∗ 2 1 + b 2 ∗ 2 2 + . . . + b n ∗ 2 n , b i = 0 o r 1 , i = 0 , . . , n b=b_0*2^0+b_1*2^1+b_2*2^2+...+b_n*2^n,b_i=0 \ or\ 1,i=0,..,n b=b0​∗20+b1​∗21+b2​∗22+...+bn​∗2n,bi​=0 or 1,i=0,..,n

a b = a b 0 ∗ 2 0 + b 1 ∗ 2 1 + b 2 ∗ 2 2 + . . . + b n ∗ 2 n = a b 0 ∗ 2 0 ∗ a b 1 ∗ 2 1 ∗ . . . ∗ a b n ∗ 2 n a^b=a^{b_0*2^0+b_1*2^1+b_2*2^2+...+b_n*2^n}=a^{b_0*2^0}*a^{b_1*2^1}*...*a^{b_n*2^n} ab=ab0​∗20+b1​∗21+b2​∗22+...+bn​∗2n=ab0​∗20∗ab1​∗21∗...∗abn​∗2n
a的b次方对p取模,每次累乘 a b i ∗ 2 i a^{b_i*2^i} abi​∗2i后立即取模,这样不会溢出。

a ∗ b = a ∗ ( b 0 ∗ 2 0 + b 1 ∗ 2 1 + b 2 ∗ 2 2 + . . . + b n ∗ 2 n ) = a ∗ b 0 ∗ 2 0 + a ∗ b 1 ∗ 2 1 + . . . + a ∗ b n ∗ 2 n a*b=a*(b_0*2^0+b_1*2^1+b_2*2^2+...+b_n*2^n)=a*b_0*2^0+a*b_1*2^1+...+a*b_n*2^n a∗b=a∗(b0​∗20+b1​∗21+b2​∗22+...+bn​∗2n)=a∗b0​∗20+a∗b1​∗21+...+a∗bn​∗2n
a乘b对p取模,每次累加 a ∗ b i ∗ 2 i a*b_i*2^i a∗bi​∗2i后立即取模,这样不会溢出。

时间复杂度,两者都是b拆开后的项数, O ( ⌊ l o g 2 b ⌋ + 1 ) ≈ O ( l o g b ) O(\lfloor{log_2b}\rfloor+1) \approx O(logb) O(⌊log2​b⌋+1)≈O(logb)

a = 4
b = 3
p = 3def quick_power(a, b, p):tmp,sum = 1, 1while b:tmp = tmp*a%p if b&1:sum = sum*tmp%pb >>= 1return sum
print(quick_power(a, b, p))def quick_mul(a, b, p):sum, tmp = 0, 1flag = Falsewhile b:if not flag:tmp *= 1flag = Trueelse:tmp = tmp*2%pif b&1:sum = (sum + a*tmp)%pb >>= 1return sum
print(quick_mul(a, b, p))

a的b次方对p取模 a乘b对p取模 快速幂相关推荐

  1. 多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题

    文章目录 多项式的逆元 理论推导 模板 例题:[luogu P4238][模板]多项式乘法逆 题目 code 多项式的除法/取模 理论推导 多项式牛顿迭代法 模板 例题:[luoguP4512][模板 ...

  2. 快速幂取模——Pupu(HDU 3003)

    题目: 由题目推出计算公式: ans = (2^(n-1) + 1) % n 因为n取值很大,所以需要用到快速幂取模: int multi(int a,int b) { int ret; ret=1; ...

  3. 【算法】求n的m次方(快速幂取模)

    题目 求n的m次方,n,m均为自然数. 解析 看似简单的题目,但是要想写的高效还不是那么容易想出来. 实现 unsigned int power(unsigned int a, unsigned in ...

  4. python快速幂算法解决大数取模

    1.前置性质 模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n 指数可以拆分成二进制的形式,如9拆分成 1001 根据二进制的计算,1001 = ((1 ...

  5. C/C++:计算N的N次方的个位数(巧用快速幂与模运算性质)

    题目描述(源自杭电OJ): 相关数学知识一:取模运算的性质  a乘b的结果对p取模等于a对p取模的结果乘b对p取模的结果再整体取模于p,详见下图 证明过程如下: 相关数学知识二:快速幂运算 以求a的b ...

  6. 大数取模运算,快速幂取模运算

    1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值. ...

  7. acm新手小白必看系列之(7)——快速幂取模精讲及例题

    acm新手小白必看系列之(7)--快速幂取模精讲及例题 性质1:(a+b)%m=(a%m+b%m)%m 性质2:(ab)%m=(a%mb%m)%m 给你一个数a,让你求其b次连乘后的结果 当b很小时, ...

  8. 关于快速幂取模计算的详细解释

    首先对于幂和取模想必大家都不是很陌生,幂即一个数的多少次方,取模即取余运算: 下面咱们进行一个数的幂取模运算的最容易想到的方式: a//底数 b//幂指数 c//取模数 //算法一: int ans= ...

  9. C语言快速幂取模算法小结

    资料链接:http://www.jb51.net/article/54947.htm C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快 ...

  10. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

最新文章

  1. ad20如何导入库_零基础小白自学Python,如何快速学会及掌握?
  2. linux c语言文件拷贝_linux - scp命令远程文件拷贝
  3. js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
  4. poi生成word不可以修改_操作不懂技术就可以做小程序无限生成平台的创业项目实操教程...
  5. neu1250矩阵快速幂哪~~
  6. cs0246未能找到类型或命名空间名_实用小工具之整理标题及数据类型
  7. Python基础——字符串、列表、元组
  8. 基于PHP的在线聊天室(网页版)
  9. php paypal网站对接,php 接入 paypal 支付
  10. 穴位--程序健康之道
  11. 那些年我准备的前端面试题
  12. java 显示百分比_Java 数字转百分比%
  13. zoj 1104 Leaps Tall Buildings(超人不会飞- -。。)
  14. 内核层读写应用层文件,使用filp_open函数——完美
  15. matlab土方计算,土方量计算的MATLAB工具箱研制
  16. 转行做产品经理,应该如何入手
  17. [16]质量控制工具 因果图-帕累托图-直方图-趋势图等
  18. JS模仿腾讯微博app撕纸效果
  19. 连接服务器教程,Xshell、Xftp及PyCharm连接深度学习GPU服务器的详细使用方法
  20. 在线网校安装简易迅捷入门安装教程

热门文章

  1. 详细对比DRAM、Flash和DDR技术 2020-11-19
  2. BOE(京东方)柔性屏显示技术发展势头强劲,赋能应用场景创新
  3. 安装Ubuntu14.04系统简易教程(使用rufus-3.1)
  4. Java判断闰年,统计1900年后闰年数
  5. java实现输出1000-2000年间闰年问题
  6. 了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?
  7. 华为q1设置虚拟服务器,华为路由Q1怎么用 华为路由Q1设置上网图文教程
  8. 【Leetcode】487. Max Consecutive Ones II
  9. rda分析怎么做_群落分析的冗余分析(RDA)概述
  10. 【编解码】从零开始写H264解码器(4) 熵编码之指数哥伦布编码