快速幂的递归形式和迭代写法(算法笔记)
作者:
小蓝
,
2019-05-12 15:08:21
,
所有人可见
,
阅读 2515
/*
递归形式
注意:15 16行 如果直接用return binaryPow(a,b/2,m)*binaryPow(a,b/2,m)%m 的话会导致效率变慢很多
eg: binaryPow(8)会先变成binaryPow(4)*binaryPow(4) 然后4又会变成两个2相乘 8的话就需要4次binaryPow(2) 然后2又变成两个1 ......
如果a本就大于m的话可以先a%=m
如果m本就为1的话 直接输出 不进入binaryPow
*/
#include<iostream>
using namespace std;
typedef long long LL;
LL binaryPow(LL a,LL b,LL m){
if(b==0) return 1;
if(b&1) return a*binaryPow(a,b-1,m)%m;
else{
LL mul=binaryPow(a,b/2,m);
return mul*mul%m;
}
}
int main(){
LL a,b,m;
while(cin>>a>>b>>m){
if(a>m) a%=m;
if(m==1){
cout<<"0"<<endl;
break;
}
LL res=binaryPow(a,b,m);
cout<<res<<endl;
}
return 0;
}
//迭代写法 https://www.cnblogs.com/wkfvawl/p/9125224.html详细说明参考
#include<iostream>
using namespace std;
typedef long long LL;
LL KSM(LL a,LL b,LL m){
a%=m;
if(m==1) return 0;
LL res=1;
while(b){
if(b&1){
res=res*a%m;
}
a=a*a%m;
b>>=1; //右移一位
}
return res;
}
int main(){
LL a,b,m;
while(cin>>a>>b>>m){
cout<<KSM(a,b,m)<<endl;
}
return 0;
}