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 }
复制代码
posted @   uf0_金币灰黄^w.h  阅读(154)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示