快速幂模板
#include<iostream>
using namespace std;
#define ll long long
#define Mod 1e+7;
ll fastPow(ll a,ll n){
ll base = a;
ll sum =1;
while(n){
if(n&1)
sum*=base;
base*=base;
n>>=1;}
return sum;
}
int main (){
int a,n;
cin>>a>>n;
cout<<fastPow(a,n); // a的n次方
}
龟速乘
用途:用于解决a,b,p都是<=1e18的数据。在快速幂中a*a是会long long溢出的。
然后龟速乘就是将乘法操作进行分步操作。
eg:
3
∗
15
=
3
∗
(
1
+
2
+
4
+
8
)
3*15 =3*(1+2+4+8)
3∗15=3∗(1+2+4+8) 将
3
∗
15
3*15
3∗15拆分成了四步所以,每次就好叠加啦
代码如下:
//龟速乘
ll mul(ll x,ll y,ll P){
ll ans=0;
while(y){
if(y&1){
ans=(ans+x)%P;
}
x=(x+x)%P;
y>>=1;
}
return ans;
}
ll qpow(ll x,ll y){
ll ans=1;
while(y){
if(y&1){
ans=Mul(ans,x);
}
x=Mul(x,x);
y>>=1;
}
return ans;
}
快速乘
前面讲到啦龟速乘,将一个简单的乘法硬生生扯到啦log(n)复杂度。所以不好嘛,我还是尽可能的将乘法在o(1)时间内完成。
快速乘的根据是将long double和long long的转换
inline ll mul(ll x,ll y){
ll d=(ll)floor(x*(long double)y/P+0.5);
ll ret=x*y-d*P;
if(ret<0) ret+=P;
return ret;
}

549

被折叠的 条评论
为什么被折叠?



