#include<iostream>
#include<cstdio>
using namespace std;
int qpow(int base, int n){
int ans = 1;
while(n){
if(n&1) ans*=base;
base = base * base;
n/=2;
}
return ans;
}
int main(){
cout << qpow(2,1) << endl;
cout << qpow(2,2) << endl;
cout << qpow(2,10) << endl;
return 0;
}
快速乘法使用二进制将乘法转化为加法,既加快可以加快运算速度,又可以防止直接相乘之后溢出
简单的写法:
ll quickMul(ll a,ll b,ll mod)
{
ll res=0;
while(b){
if(b&1) res=(res+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return res;
}
更快更高效的写法:
ll mul(ll a,ll b,ll mod)
{
a%=mod;
b%=mod;
ll res=0;
while(b){
if(b&1){
//printf("%lld %lld %lld\n",a,b,res);
res+=a;
if(res>=mod)
res-=mod;
}
b>>=1;
a<<=1;
if(a>=mod) a-=mod;
}
return res;
}
ll quickPow(ll a,ll b,ll m)
{
ll res=1;
while(b){
if(b&1)
res=mul(res,a,m);
a=mul(a,a,m);
b>>=1;
}
return res;
}
利用快速乘法优化的快速幂:
ll mul(ll a,ll b,ll mod)
{
a%=mod;
b%=mod;
ll res=0;
while(b){
if(b&1){
//printf("%lld %lld %lld\n",a,b,res);
res+=a;
if(res>=mod)
res-=mod;
}
b>>=1;
a<<=1;
if(a>=mod) a-=mod;
}
return res;
}
ll quickPow(ll a,ll b,ll m)
{
ll res=1;
while(b){
if(b&1)
res=mul(res,a,m);
a=mul(a,a,m);
b>>=1;
}
return res;
}