数学知识:快速幂

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

文章目录

前言

一、快速幂

二、例题,代码

AcWing 875. 快速幂

本题解析

AC代码

AcWing 876. 快速幂求逆元

本题解析

AC代码

三、时间复杂度


前言

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


一、快速幂

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


二、例题,代码

AcWing 875. 快速幂

本题链接:AcWing 875. 快速幂

本博客提供本题截图:

image.png


本题解析

我们把a^b中的b当成它的二进制去考虑这个题,这里举一个例子,比如说是a^(1001)2,这样我们就可以按照如下图的方法去计算它的值:

image.png

这就是快速幂的核心思想

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. 快速幂求逆元

本博客提供本题截图:

image.png

本题解析

本题其实就是去求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;
}

三、时间复杂度

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

目录
相关文章
|
8月前
|
存储 缓存 API
电商行业中 API 接口的常见问题和解决方法
本文探讨了电商行业中API接口的常见问题及解决方法。涵盖数据准确性(如数据不一致、数据缺失)、性能问题(如响应时间过长、吞吐量不足)、安全问题(如身份认证与授权、数据泄露风险)和兼容性问题(如接口版本兼容性、系统兼容性)。通过优化数据同步机制、缓存策略、网络配置、服务器负载均衡、代码逻辑,以及采用安全的身份认证方式和加密技术,结合实际代码示例,帮助开发者提升API接口的稳定性和安全性,确保电商业务顺利运行。
364 11
|
10月前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
存储 数据管理 数据库
Axure中继器入门:打造你的动态原型
Axure中继器入门:打造你的动态原型
113 0
|
JavaScript Java 测试技术
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
211 0
|
监控 Linux
epoll 的用法
【4月更文挑战第16天】epoll 通过改进的接口设计,避免了用户态 - 内核态频繁的数据拷贝,大大提高了系统性能。在使用 epoll 的时候,我们一定要理解条件触发和边缘触发两种模式。
|
缓存 前端开发
禁用文字选中
禁用文字选中
87 0
|
Java
多线程实例代码(demo)
多线程实例代码(demo)
199 0
|
Linux
Linux系统之Network静态路由配置
Linux系统之Network静态路由配置
475 0
Linux系统之Network静态路由配置
|
Java Spring
spring data solr实现关键字搜索+高亮显示+分组查询
spring data solr实现关键字搜索+高亮显示+分组查询
331 0
spring data solr实现关键字搜索+高亮显示+分组查询
|
Linux
CentOS 7如何建立Terminal的桌面图标?
CentOS 7如何建立Terminal的桌面图标?
1192 0