目的
减小时间复杂度
基本例子
a的b次方,最后取模
暴力代码
long long ans=1;
long long a,b;
for(long long i=1;i<=b;i++)
{
ans*=a;
}
ans%=c;
当数据大的时候就不行了
思路讲解
3¹⁰=(3²)⁵= 9⁵ =9×(9² × 9²) = 9×81²
3¹⁰=9⁵=9×81²
a的平方的b/2次幂等于a的b次幂,奇数的时候先乘以a;
优化(即快速幂)
long long quickmi(long long a,long long b,long long c)
{
long long ans=1;
a%=c;
while(b)
{
if(b%2==1)//奇数特判
{
ans=ans*a%c;
)
a=a*a%c;
b/=2;
}
return ans;
}
位运算写法(终极优化)
long long quickmi(long long a,long long b,long long c)
{
long long ans=1;
a%=c;//直接取模防止数太大
while(b)
{
if(b&1)//与运算最后一位是1就说明是奇数
{
ans=ans*a%c;
)
a=a*a%c;
b>>=1;//二进制右移一位相当于除以2
}
return ans;
}