a的b次方对p取模 a乘b对p取模 快速幂
思路:对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(⌊log2b⌋+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取模 快速幂相关推荐
- 多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题
文章目录 多项式的逆元 理论推导 模板 例题:[luogu P4238][模板]多项式乘法逆 题目 code 多项式的除法/取模 理论推导 多项式牛顿迭代法 模板 例题:[luoguP4512][模板 ...
- 快速幂取模——Pupu(HDU 3003)
题目: 由题目推出计算公式: ans = (2^(n-1) + 1) % n 因为n取值很大,所以需要用到快速幂取模: int multi(int a,int b) { int ret; ret=1; ...
- 【算法】求n的m次方(快速幂取模)
题目 求n的m次方,n,m均为自然数. 解析 看似简单的题目,但是要想写的高效还不是那么容易想出来. 实现 unsigned int power(unsigned int a, unsigned in ...
- python快速幂算法解决大数取模
1.前置性质 模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n 指数可以拆分成二进制的形式,如9拆分成 1001 根据二进制的计算,1001 = ((1 ...
- C/C++:计算N的N次方的个位数(巧用快速幂与模运算性质)
题目描述(源自杭电OJ): 相关数学知识一:取模运算的性质 a乘b的结果对p取模等于a对p取模的结果乘b对p取模的结果再整体取模于p,详见下图 证明过程如下: 相关数学知识二:快速幂运算 以求a的b ...
- 大数取模运算,快速幂取模运算
1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值. ...
- acm新手小白必看系列之(7)——快速幂取模精讲及例题
acm新手小白必看系列之(7)--快速幂取模精讲及例题 性质1:(a+b)%m=(a%m+b%m)%m 性质2:(ab)%m=(a%mb%m)%m 给你一个数a,让你求其b次连乘后的结果 当b很小时, ...
- 关于快速幂取模计算的详细解释
首先对于幂和取模想必大家都不是很陌生,幂即一个数的多少次方,取模即取余运算: 下面咱们进行一个数的幂取模运算的最容易想到的方式: a//底数 b//幂指数 c//取模数 //算法一: int ans= ...
- C语言快速幂取模算法小结
资料链接:http://www.jb51.net/article/54947.htm C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快 ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
最新文章
- ad20如何导入库_零基础小白自学Python,如何快速学会及掌握?
- linux c语言文件拷贝_linux - scp命令远程文件拷贝
- js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
- poi生成word不可以修改_操作不懂技术就可以做小程序无限生成平台的创业项目实操教程...
- neu1250矩阵快速幂哪~~
- cs0246未能找到类型或命名空间名_实用小工具之整理标题及数据类型
- Python基础——字符串、列表、元组
- 基于PHP的在线聊天室(网页版)
- php paypal网站对接,php 接入 paypal 支付
- 穴位--程序健康之道
- 那些年我准备的前端面试题
- java 显示百分比_Java 数字转百分比%
- zoj 1104 Leaps Tall Buildings(超人不会飞- -。。)
- 内核层读写应用层文件,使用filp_open函数——完美
- matlab土方计算,土方量计算的MATLAB工具箱研制
- 转行做产品经理,应该如何入手
- [16]质量控制工具 因果图-帕累托图-直方图-趋势图等
- JS模仿腾讯微博app撕纸效果
- 连接服务器教程,Xshell、Xftp及PyCharm连接深度学习GPU服务器的详细使用方法
- 在线网校安装简易迅捷入门安装教程
热门文章
- 详细对比DRAM、Flash和DDR技术 2020-11-19
- BOE(京东方)柔性屏显示技术发展势头强劲,赋能应用场景创新
- 安装Ubuntu14.04系统简易教程(使用rufus-3.1)
- Java判断闰年,统计1900年后闰年数
- java实现输出1000-2000年间闰年问题
- 了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?
- 华为q1设置虚拟服务器,华为路由Q1怎么用 华为路由Q1设置上网图文教程
- 【Leetcode】487. Max Consecutive Ones II
- rda分析怎么做_群落分析的冗余分析(RDA)概述
- 【编解码】从零开始写H264解码器(4) 熵编码之指数哥伦布编码