前置知识
用二进制表示数字的方法(需要熟练理解)
基本思想
快速幂的基本思想就是将运算进行"降幂",再利用二进制数字合并的原理减少运算次数。
例如,计算a^b则需要不停计算a*a;同理,计算a*b则需要不停计算a+a。
例题
1.求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9。(题目链接)
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll poww(ll a,ll b,ll p){
ll ans=1;
for(;b;b>>=1){
if(b&1)ans=(ll)ans*a%p;
a=(ll)a*a%p;
}
return ans%p;
}
int main(){
ll a,b,p;
cin>>a>>b>>p;
cout<<poww(a,b,p)<<endl;
return 0;
}
2.求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤10^18。(题目链接)
这个题可以说是利用了快速幂的思想,即将一个乘法转换为多个加法,本质上与快速幂类似。
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll mul(ll a,ll b,ll p){
ll ans=0;
for(;b;b>>=1){
if(b&1)ans=(ans+a)%p;
a=a*2%p;
}
return ans%p;
}
int main(){
ll a,b,p;
scanf("%lld%lld%lld",&a,&b,&p);
printf("%lld
",mul(a,b,p));
return 0;
}