当前位置: 首页 > news >正文

【数论】快速幂

快速幂

给定 n 组 a i a_i ai, b i b_i bi, p i p_i pi,对于每组数据,求出 a i b i m o d {a_i}^{b_i} mod aibimod p i p_i pi 的值。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含三个整数 a i a_i ai, b i b_i bi, p i p_i pi

输出格式

对于每组数据,输出一个结果,表示 a i b i m o d {a_i}^{b_i} mod aibimod p i p_i pi的值。

每个结果占一行。

数据范围

1≤n≤100000,
1≤ a i a_i ai, b i b_i bi, p i p_i pi≤2× 1 0 9 10^9 109

输入样例:
2
3 2 5
4 3 9
输出样例:
4
1

【思路分析】

如果使用朴素算法要进行b次乘积运算,因此朴素算法的时间复杂度是O(b)的

但是使用快速幂算法即可将时间复杂度优化为logb的

快速幂的思路如下

对于一个数 a b a^b ab 我们可以先将

a 2 0 a ^{2^0} a20 mod p

a 2 1 a ^{2^1} a21 mod p

a 2 2 a ^{2^2} a22 mod p

a 2 l o g b a ^{2^{logb}} a2logb mod p

预处理出来

而且可以发现 a i a^{i} ai = a i − 1 a^{i - 1} ai1 * a i − 1 a^{i - 1} ai1 mod p

然后 a b a^b ab 就可以用预处理出来的数来表示

例如b的二进制是101101

a 45 a^{45} a45 = a 2 0 a ^{2^0} a20 * a 2 2 a ^{2^2} a22 * a 2 3 a ^{2^3} a23 * a 2 5 a ^{2^5} a25

代码如下

import java.io.*;
import java.util.*;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));PrintWriter pw = new PrintWriter(System.out);int n = Integer.parseInt(br.readLine());while(n-- > 0) {String[] data = br.readLine().split(" ");int a = Integer.parseInt(data[0]);int b = Integer.parseInt(data[1]);int p = Integer.parseInt(data[2]);pw.println(function((long)a, b, p));}br.close();pw.close();}//求快速幂 a^b % ppublic static long function(long a, int b, int p) {long res = 1 % p;while(b > 0) {//如果b的末位是1if((b & 1) == 1) {res = res * a % p;}//a的计算可以通过上一次的a求出a = a * a % p;//b右移一位b >>= 1;}return res;}
}

快速幂的应用:求逆元

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

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

乘法逆元的定义

若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a b \frac{a}{b} ba ≡ a× x x x(mod m),则称 x x x 为b 的模 m 乘法逆元,记为 b − 1 b^{−1} b1 (mod m) 。

b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时, b m − 2 b^{m−2} bm2 即为 b 的乘法逆元。

输入格式

第一行包含整数 n。

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

输出格式

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

a i a_i ai p i p_i pi 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible

数据范围

1≤n≤ 1 0 5 10^5 105,
1≤ a i a_i ai, p i p_i pi≤2∗ 1 0 9 10^9 109

输入样例:
3
4 3
8 5
6 3
输出样例:
1
2
impossible
费马小定理(可以通过欧拉函数推出)

费马小定理表述为:若 p 是质数,且整数 a 与 p 互质(即 gcd(a,p)=1,gcd表示最大公约数 ),那么有 a p − 1 a ^ {p - 1} ap1 ≡ 1 (mod p) 。

推导乘法逆元公式

已知乘法逆元的定义:对于整数 a 和质数 p ,若存在整数 x ,使得 ax ≡ 1 (mod p) ,则 x 是 a 模 p 的乘法逆元。 由费马小定理 a p − 1 a ^ {p - 1} ap1 ≡ 1 (mod p) ,等式两边同时除以 a (因为 a 与 p 互质,所以可以除 ),得到 a p − 2 a ^ {p - 2} ap2 1 a \frac{1}{a} a1 (mod p) 。 也就是说,当 p 是质数且 a 与 p 互质时,a 模 p 的乘法逆元就是 a p − 2 a^{p - 2} ap2 mod p。

import java.io.*;
import java.util.*;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));PrintWriter pw = new PrintWriter(System.out);int n = Integer.parseInt(br.readLine());while(n-- > 0) {String[] data = br.readLine().split(" ");int a = Integer.parseInt(data[0]);int p = Integer.parseInt(data[1]);//如果a是p的倍数,则一定没有逆元if(a % p == 0) {pw.println("impossible");} else {pw.println(function((long)a, p - 2, p));}}br.close();pw.close();}//求快速幂 a^b % ppublic static long function(long a, int b, int p) {long res = 1 % p;while(b > 0) {if((b & 1) == 1) {res = res * a % p;}a = a * a % p;b >>= 1;}return res;}
}
http://www.xdnf.cn/news/67699.html

相关文章:

  • 用自然语言指令构建机器学习可视化编程流程:InstructPipe 的创新探索
  • 策略模式:思考与解读
  • 记一次 .NET某旅行社酒店管理系统 卡死分析
  • 剑指offer经典题目(五)
  • 数据库管理-第317期 Oracle 12.2打补丁又出问题了(20250421)
  • SAP系统生产跟踪报表入库数异常
  • SSH反向代理
  • C++——STL——容器deque(简单介绍),适配器——stack,queue,priority_queue
  • 23种设计模式-结构型模式之代理模式(Java版本)
  • Fortran 2008标准引入了多项新特性,其中一些对性能有显著影响一些语言新特征
  • C++--负载均衡在线OJ
  • OpenCV 图形API(48)颜色空间转换-----将 LUV 颜色空间的图像数据转换为 BGR 颜色空间函数LUV2BGR()
  • 在Cursor编辑器上部署MCP(Minecraft Coder Pack)完整指南
  • 进程与线程:02 多进程图像
  • 深入理解React高阶组件(HOC):原理、实现与应用实践
  • 如何测试雷达与相机是否时间同步?
  • 高并发内存池项目
  • EMQX学习笔记
  • ECharts散点图-散点图14,附视频讲解与代码下载
  • Vue3 源码解析(六):响应式原理与 reactive
  • 解决go项目构建后不能夸Linux平台的问题
  • JavaScript-ES5 循环中的闭包 “共享变量” 问题
  • 部署本地Dify
  • 智能安全用电系统预防电气线路老化、线路或设备绝缘故障
  • Windows部署FunASR实时语音听写便捷部署教程
  • Python Cookbook-6.6 在代理中托管特殊方法
  • AI重塑网络安全:机遇与威胁并存的“双刃剑”时代
  • CI/CD
  • Servlet上传文件
  • 2025年渗透测试面试题总结-拷打题库10(题目+回答)