快速幂解析
一.快速幂简介
快速幂是用来快速计算指数类的值。
当指数很小时,直接暴力即可(例2^6),但指数很大时就不适用暴力法了。
二.原理
(举个例子用的数较小,由于指数爆炸通常数都是非常大的)当要计算2^20
可以采用缩小指数,放大底数方法,减少计算量 2^20 == 4^10,
循环求数时从循环20次减到10次,当然可以继续化简。
三.例题讲解
洛谷第1226道,快速幂模版
(1)题目展示
给你三个整数
a,b,p,求 a^b mod p。
输入格式
输入只有一行三个整数,分别代表 a,b,p。
输出格式
输出一行一个字符串 a^b mod p=s,其中
a,b,p 分别为题目给定的值,
s 为运算结果。
输入输出样例
输入 #1
2 10 9
输出 #1
2^10 mod 9=7
说明/提示
样例解释
2^10=1024
1024mod9=7。
数据规模与约定
对于
100
%
100% 的数据,保证
0≤a,b<2 ^31 a+b>0,2≤p<2 ^31
(2)代码解析
//retu结果,对p取模
while(b)//b为指数
{
if(b%2==1)//由于指数是成2倍缩小,当指数为基数时,指数减1,结果乘一个底数
retu=(retua)%p;//这个循环未进行指数减1,是因为奇数减一得到的偶数,和奇数除2得的数相同(5/2=2和4/2=2结果相同)
b=b>>1;//位运算,等价于b/=2;
a=(aa)%p;//指数每缩小2倍,底数则平方;
}
最终底数为1(2>>1=1)进入if语句中,取得最终结果retu。
(3)代码展示
#include
#include
using namespace std;
int main()
{
long long a,b,c,d,p,retu=1;
cin>>a>>b>>p;
c=b;d=a;
while(b)
{
if(b%2==1)
retu=(retua)%p;
b=b>>1;//位运算,等价于b/=2;
a=(aa)%p;
}
cout<<d<<“^”<<c<<" “<<“mod”<<” “<<p<<”="<<retu<<endl;
return 0;
}