1. 求幂取模问题
2. 求幂取模问题进阶
2.1 递归解法
typedef long long LL;
//求a^b % m,递归写法
LL binaryPow(LL a,LL b,LL m){
if(b == 0) return 1; //如果b为0,那么a^0=1
//b为奇数,转换为b-1
if(b % 2 == 1) return a * binaryPow(a,b-1,m) % m;
else{//b为偶数,转换为b/2
LL mul = binaryPow(a,b/2,m);
return mul*mul % m;
}
}
注意:
- 符号
*
和符号%
的优先级是一样的,所以会按照先左后右的顺序计算。- 条件
if(b % 2 == 1)
可以用if(b & 1)
代替。这样通过“与”运算,速度会快很多。
2.2 迭代解法
递归写法和迭代写法的效率差不多,我更喜欢递归,因为简单吧。
我错了,矩阵快速幂的时候需要用到迭代的写法。。。。
//快速幂的递推写法
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main(){
ll a,b,m;
while(scanf("%lld %lld %lld",&a,&b,&m)!=EOF){
//求解快速幂
ll ans=1;
while(b>0){
if(b&1==1){
//需要进行乘法
ans = (a*ans)%m;
}
a = a*a%m; //对a进行翻倍的操作
b = b>>1;
}
printf("%lld\n",ans);
}
return 0;
}