数学知识:快速幂


前言

复习acwing算法基础课的内容,本篇为讲解数学知识:快速幂,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、快速幂

所谓快速幂就是用很短的时间去解决a^b % c,解决这类的问题,最传统的做法就是循环暴力枚举,但是一旦我们的范围在1e8+,这种暴力的枚举显然会TLE,这也是快速幂算法的独到之处.


二、例题,代码

AcWing 875. 快速幂

本题链接:AcWing 875. 快速幂
本博客提供本题截图:
在这里插入图片描述

本题解析

我们把a^b中的b当成它的二进制去考虑这个题,这里举一个例子,比如说是a^(1001)2,这样我们就可以按照如下图的方法去计算它的值:
在这里插入图片描述
这就是快速幂的核心思想

AC代码

#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long LL;

LL qmi(int a, int b, int p)
{
    LL res = 1;
    while (b)
    {
        if (b & 1) res = res * a % p; //快速幂
        b >>= 1;                   	  //每次都把b向右移动一个二进制长度
        a = (LL)a * a % p;            //每次都把a平方
    }
    
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while (n -- )
    {
        int a, b, p;
        scanf("%d%d%d", &a, &b, &p);
        printf("%lld\n", qmi(a, b, p));
    }

    return 0;
}

AcWing 876. 快速幂求逆元

本题链接:AcWing 876. 快速幂求逆元
本博客提供本题截图:
在这里插入图片描述

本题解析

本题其实就是去求a^(p - 2) mol p,注意如果a % p == 0的情况是无解的,输出impossible

AC代码

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

LL qmi(int a, int b, int p)
{
    LL res = 1;
    while (b)
    {
        if (b & 1) res = res * a % p;
        a = a * (LL)a % p;
        b >>= 1;
    }
    
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while (n -- )
    {
        int a, p;
        scanf("%d%d", &a, &p);
        
        if (a % p == 0) puts("impossible");
        else printf("%lld\n", qmi(a, p - 2, p));
    }

    return 0;
}

三、时间复杂度

关于快速幂各步操作的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

辰chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值