寒假快速幂算法

快速幂就是计算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就行了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

里科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值