一、引言
快速幂是一种快速进行幂运算的算法,顾名思义,快速幂就是快速算底数的n次幂,时间复杂度
变为了(n),比O(n)要快不少.
二、原理
所以,快速幂变快的原理是什么?
众所周知,任何一个正整数都可以用不同的二进制数来表示,而二进制中每一位的前一位都是该位的两倍,则我们可以减少运算次数。
例如:要计算2^10,10在二进制中为“1010”
则我们可以用2*2算出2^2接着用(2^2)*(2^2)算出2^4
接着用(2^4)*(2^4)算出2^8
最后将2^8与2^2相乘,即可得出2^10
三、代码
因为幂算完后值往往会很大,所以题经常会让模上一个很大的质数,类似于1e9+7这种
模版题题目如下:
题目描述
给你三个整数a,b,p 求
a^b mod p=s
.输入格式
输入只有一行三个整数,分别代表
a,b,p
.输出格式
输出一行一个字符串
a^b mod p=s
,其中a,b,p
分别为题目给定的值, s 为运算结果。输入输出样例
输入2 10 9输出2^10 mod 9=7
下面是快速幂(这道题的题解)的代码
//快速幂
#include<iostream>
using namespace std;
long long a, b, p; //a^b%p
long long pmi(long long a, long long b, long long p){
long long res = 1; //答案保存变量
while(b){ //当b一直右移还未结束时运行下方代码
if(b & 1){ //当b的二进制表达式的最后一位是1时就将其加到答案数组
res = res * a % p;
}
a = a * a % p; //将基数乘a 模p防止数据溢出
b >>= 1; //接着处理下一位(左一位)
}
return res;
}
int main(){
scanf("%lld%lld%lld",&a,&b,&p);
printf("%lld^%lld mod %lld=%lld",a,b,p,pmi(a,b,p));
}