快速幂是很多数学题的最基本的东西,是一种可以在 的复杂度求解 的问题的算法。
一般来说,求解 的问题要循环 次,每次乘 ,时间复杂度 。 但是快速幂用到了一个性质:任何一个正整数都可以写成几个 的次幂的和,其实就是可以转换成二进制。 所以可以将 转换成:
则 变为:
剩下的预处理解决即可,也可以边做边出来。
因为 ,所以时间复杂度是 。
注意点 1.注意取模,取模不当很容易爆。
code
cpp#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll p){
ll ans=1;
a%=p;
while(b){
if(b&1){
ans*=a%p;
ans%=p;
}
a=a*a%p;
a%=p;
b>>=1;
}
return ans;
}
int main(){
ll a,b,p;
cin>>a>>b>>p;
cout<<a<<'^'<<b<<" mod "<<p<<'='<<qpow(a,b,p);
return 0;
}
