快速幂就是计算a^b的一种算法,是一种比较常见的算法。首先我们看一道例题
求A^B的最后三位数表示的整数。
这道题看起来很简单,因为很容易想到用一个进行B次的循环来相乘
long long num=1;
for(int i=0;i<B;i++)
num=num*A;
num%=1000;
虽然很简单,但存在很多问题,比如(0<=B<=1e9),B为1e9时,就要运行1e9次,时间肯定是不够用的,这个时候就要用到快速幂了,看题。
求 a 的 b 次方对 p 取模的值。
输入格式
三个整数 a,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
0≤a,b≤10^9
1≤p≤10^9
先看代码
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
long long a,b,mod,m=1;
cin>>a>>b>>mod;
m=m%mod;
while(b)
{
if(b&1)//奇数满足,单独拿出
m=m*a%mod;
b>>=1;//除以二
a=a*a%mod;
}
cout<<m;
return 0;
}
用位运算的快速幂:我们知道2^7==2*2^6==2*4*3==2*4*4^2==2*4*16,这样原本要进行7次的循环就被缩减成了3次循环,用二进制来表示就是111,个位上的1单独拿出来相乘,表示乘以2^1,自身再平方一下,然后111就变成11,个位为1,再单独拿出乘以2^2,自身再平方一下,最后剩1,再乘以2^4就行了