0019:快速幂
题目链接:https://www.luogu.com.cn/problem/P1226
给你三个整数 a,b,p,求 a^b mod p 的值。
这道题就是快速幂的模板题。
那么,什么是快速幂呢?
普通的幂运算就是让 b 个 a 相乘,但这样的时间复杂度较高,有 O(n)
接下来就要介绍一种时间复杂度只有O(log n)的算法。
众所周知,任何十进制数都可以拆成几个2^n 相加。如 11=1011=2^3+2^1+2^0。
同理,幂运算可以表示为a^1+a^2+a^3......(不是每个数都有,取决于指数)
进行幂运算时,我们可以将指数转化2进制,然后判断它在i维是否为1,如果是,让结果 *(a^i)。
上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 long long a,b,p;//一定要用long long,不然只有36分 5 long long we=1;//一定要赋值为1,如果赋值为0的话所有结果全都是0 6 cin>>a>>b>>p; 7 cout<<a<<"^"<<b<<" mod "<<p<<"="; 8 while(b){ 9 if(b&1){//如果b的最后一位是1 10 we=(we*a)%p;//结果*a^i 11 } 12 a=(a*a)%p;//a平方 13 b>>=1;//舍弃b的最后一位 14 } 15 cout<<we; 16 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律