acwing基础课——快速幂

news/2024/11/29 9:58:22/

由数据范围反推算法复杂度以及算法内容 - AcWing

常用代码模板4——数学知识 - AcWing

基本思想:

     求一个数的n次时,我们的时间复杂度为O(n),当n特别大时,效率会很低可能超时,此时我们就需要运用到快速幂,将我们的时间复杂度降低到O(log n)。快速幂的核心思想是,我们预处理一些数据,然后将a^k用我们预处理的数据组合出来,即将a^k拆成若干个预处理的值,我们将k转化为二进制表示,就可以得到我们所需要的数据。

       那么 为什么快速幂的时间复杂度为O(log n)呢?因为我们首先要预处理出log k个数据,对于a的k次方,我们预处理a的2^0,a的2^1,....,a的2^log k,并且可以看出每一个数都是前一个数的平凡,我们直接累积就可以处理出来。

         然后,我们如何将a^k拆成我们预处理的值呢?我们可以将a^k拆成a的2^x1, .... ,a的2^xt的乘积,也等于a的2^x1 + 2^x2 + ... + 2^xt,这样我们就可以发现,我们将k转化成二进制,将对应1的预处理好的数据进行计算即可。这样我们只用花费O(log n)预处理数据,O(1)计算就可以得出答案。

         示例,4^5 mod 10, 我们预处理出 4 的 2^0, 4的2^1,4的2^2,然后将4^5拆解,5的二进制表示为101,即取出4 的 2^0和4的2^2相乘得到结果。

 875. 快速幂 - AcWing题库

给定 n 组 ai,bi,pi,对于每组数据,求出 ai ^ bi mod pi 的值。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含三个整数 ai,bi,pi。

输出格式

对于每组数据,输出一个结果,表示 ai ^ bi mod pi  的值。

每个结果占一行。

数据范围

1≤n≤100000,
1≤ai,bi,pi≤2×1e9

输入样例:

2
3 2 5
4 3 9

输出样例:

4
1
#include<iostream>using namespace std;typedef long long LL;int qmi(int a, int b, int p)
{LL res = 1 % p;while(b){if(b & 1) res = res * a % p;a = (LL)a * a % p;b >>= 1;}return res;
}int main()
{int n;cin >> n;while(n--){int a, k, p;cin >> a >> k >> p;cout << qmi(a, k, p) << endl;}return 0;
}

876. 快速幂求逆元 - AcWing题库

         快速幂加上费马定理(假如p是质数,且gcd(a,p)=1(a和p互质),那么 a^(p-1)  ≡ 1(mod p),即 ( a^(p-1) )%p = 1)的运用,无解的情况为两数不互质,即a为p的倍数,否则我们一定可以通过费马定理构造出来一个解

给定 n 组 ai,pi,其中 pi 是质数,求 ai 模 pi 的乘法逆元,若逆元不存在则输出 impossible

注意:请返回在 0∼p−1 之间的逆元。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个数组 ai,pi,数据保证 pi 是质数。

输出格式

输出共 n 行,每组数据输出一个结果,每个结果占一行。

若 ai 模 pi 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible

数据范围

1≤n≤1e5,
1≤ai,pi≤2∗1e9

输入样例:

3
4 3
8 5
6 3

输出样例:

1
2
impossible
#include<iostream>
#include<algorithm>using namespace std;typedef long long LL;int qmi(int a, int b,int p)
{LL res = 1;while(b){if(b & 1) res = (LL) res * a % p;b >>= 1;a = (LL) a * a % p;}return res;
}int main()
{int n;cin >> n;while(n--){int a,p;cin>>a>>p;if(a % p == 0) cout << "impossible" << endl;else cout << qmi(a,p - 2,p) << endl;}return 0;
}

http://www.ppmy.cn/news/18965.html

相关文章

JavaScript 输出

JavaScript 输出 很遗憾&#xff0c;在javascript中我们找不到输出和打印的函数。 但是我们可以使用其他的方式来显示需要的数据: 我们可以使用 console.log() 在浏览器控制台上面输出内容我们可以使用innerHTML 把内容写入到 HTML 元素。我们可以使用 document.write() 方法…

【进击的算法】基础算法——动态规划

&#x1f37f;本文主题&#xff1a;动态规划 &#x1f388;更多算法&#xff1a;回溯算法 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录一、前言二、概念2.1概念一&#xff1a;状态转移2.2概念二&#xff1a;Dp数组三、例题3.1斐波那契数列3.1.1题目描述3.1.2状态…

客快物流大数据项目(一百零七):物流信息查询服务接口开发解决方案

文章目录 物流信息查询服务接口开发解决方案 一、业务需求 二、系统架构演变 1、​​​​​​​集中式架构 2、​​​​​​​​​​​​​​垂直拆分 3、分布式服务 ​​​​​​​4、面向服务架构&#xff08;SOA&#xff09; 5、微服务架构 ​​​​​​​三、技术…

Tomcat启动的两个问题

文章目录小结问题及解决Address already in use: JVM_BindNo buffer space available &#xff0c;tomcat启动报错参考小结 Tomcat服务碰到两个常见的问题&#xff0c;进行了解决。 问题及解决 Address already in use: JVM_Bind 端口被占用的问题经常会碰到&#xff0c;最…

Allegro如何添加平衡铜操作指导

Allegro如何添加平衡铜操作指导 PCB在加工的时候,工厂会添加平衡铜,Allegro支持自动加上平衡铜,如下图 具体操作如下 选择Manufacture点击Thieving

官方正品 | Ultralytics YOLOv8算法来啦(尖端SOTA模型)

&#x1f680;&#x1f680;&#x1f680;卷王之王 | Ultralytics YOLOv8 算法来啦&#xff01;&#xff01;✨✨✨ 一、前言简介 &#x1f384;&#x1f388; &#x1f4da; 代码地址&#xff1a;卷王之王 | YOLOv8代码下载地址 &#x1f4da; 详细文档&#xff1a;https://…

day24-网络编程02

1.NIO 1.1 NIO通道客户端【应用】 客户端实现步骤 打开通道指定IP和端口号写出数据释放资源 示例代码 public class NIOClient {public static void main(String[] args) throws IOException {//1.打开通道SocketChannel socketChannel SocketChannel.open();//2.指定IP和端…

Java基础之《netty(31)—用netty实现RPC》

一、需求说明 1、dubbo底层使用了netty作为网络通讯框架&#xff0c;要求使用netty实现一个简单的RPC框架。 2、模仿dubbo&#xff0c;消费者和提供者约定接口和协议&#xff0c;消费者远程调用提供者的服务&#xff0c;提供者返回一个字符串&#xff0c;消费者打印提供者返回…