快速幂
求abab:
当b为偶数时,ab=a(b/2)∗2=(a2)b/2ab=a(b/2)∗2=(a2)b/2
当b为奇数时, ab=a∗ab−1=a∗(a2)(b−1)/2ab=a∗ab−1=a∗(a2)(b−1)/2
如:28=(22)428=(22)4
27=2∗(22)327=2∗(22)3
当指数大于1时,如果幂为偶数,则将指数除以2,底数平方;如果幂为奇数,先提出来一个底数,然后指数减一,变为偶数。一直做下去,直到指数为1,返回结果。
时间复杂度:O(log2nlog2n)
快速幂模板
#include<bits/stdc++.h>
using namespace std;
int pow(int a,int b){
int ans = 1;
while(b!=0){
if(b&1) ans *= a;
a *= a;
b >>= 1;
}
return ans;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<pow(a,b)<<endl;
return 0;
}
二进制运算
x & 1 == 0 //x为偶数
x & 1 == 1 //x为奇数
x >>= 1 移位运算
快速幂取模模板
#include<bits/stdc++.h>
using namespace std;
int f(int a,int b,int m){
int ans = 1;
a = a % m;
while(b){
if(b&1){
ans = ans * a % m;
}
a = a * a % m;
b>>=1;
}
return ans;
}
int main()
{
int a,b,m;
cin>>a>>b>>m;
cout<<f(a,b,m)<<endl;
return 0;
}