快速幂

让人想犯罪 __ 提交于 2020-03-07 10:19:42

快速幂:

快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为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; 
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!