快速幂:
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。
求a的n次方,普通情况是这样的:
int ans=1;
for(i=1;i<=n;i++)
ans*=a;
可以知道时间复杂度为O(n)。
而快速幂,举一个例子吧,不多半页或一页的定义,直接给出例子,应该更好理解一点。
比如:
求a的11次方:(快速幂)
11可以写成二进制(1011),即2的11次方==2的1011(二进制表示)次方。
而2的1次方乘以本身等于2的2次方(我们暂时将2的1次方记为一阶)
2的2次方乘以本身等于2的4次方(我们暂时将2的2次方记为二阶)
2的4次方乘以本身等于2的8次方(我们暂时将2的4次方记为三阶)
那么我们可以知道:2的11次方=2的1次方×2的2次方×2的8次方
也就是ans=一阶×二阶×四阶(这个时候对比11的二进制1011)
可以发现刚好从右往左,是第一位,第二位,第四位是1。
快速幂求a的n次方对m取模:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int main()
{
int a,n,m,ans=1;
cin>>a>>n>>m;
while(n)
{
if(n&1)//奇数
ans=(ans*a)%m;
a=(a*a)%m;
n>>=1;//右移一位,相当于对2取整
}
cout<<ans<<endl;
return 0;
}
来源:CSDN
作者:zhe个芦苇
链接:https://blog.csdn.net/qiaoermeng/article/details/104650460