快速幂(Exponentiation by squaring,平方求幂)
:简单而高效地计算方法,算法的时间复杂度是O(Log n)。
例题:3的5次方如何计算呢?(a的n次方%p)
方法一:33333=243(进行四次连乘,复杂度为O(n-1),适用于a,n都很小的情况。
方法二(递归算法):a的n/2次方a的n/2次方a。即a的n-1次方*a。
模板:
#include <bits/stdc++.h>//递归模板求快速幂;复杂度O(log n)
using namespace std;
#define ll long long
const int mod=1e9+7;
ll qpow(int a, int n)
{
if(n==0)
{
return 1;
}
else if(n & 1)//为奇数
{
return qpow(a,n-1)*a%mod;
}
else//为偶数
{
ll t=qpow(a,n/2)%mod;//记录下来减少运算次数
return t*t%mod;
}
}
int main()
{
ll a,n;
cin>>a>>n;
cout<<qpow(a,n);
return 0;
}
方法三(非递归算法):3的5次方按照3的(0101)二进制权值展开计算。
模板:
#include <bits/stdc++.h>//非递归求快速幂模板;复杂度O(log n)
using namespace std;
#define ll long long
const int mod=1e9+7;
ll qpow(int a, int n)
{
ll ans = 1;//(连乘器)
while(n)
{
if(n & 1)//n的当前末尾为1
{
ans =ans*a%mod;//ans乘上当前的a
}
a =a*a%mod;//a自乘
n >>=1;//n右移一位
}
return ans % mod;
}
int main()
{
ll a,n;
cin>>a>>n;
cout<<qpow(a,n);
return 0;
}