快速幂例题详解

快速幂解析

一.快速幂简介

快速幂是用来快速计算指数类的值。
当指数很小时,直接暴力即可(例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=(a
a)%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=(a
a)%p;
}
cout<<d<<“^”<<c<<" “<<“mod”<<” “<<p<<”="<<retu<<endl;
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值