快速幂(求解原理+例题)

目录

反复平方法(快速幂):

代码: 

例题:快速幂求逆元


作用:

        快速求出 a^k \ mod \ p 的结果。

时间复杂度:

        O(logk)

        如果使用一般做法,从1循环到k,时间复杂度是O(k)

 

反复平方法(快速幂):

        将 k 用二进制表示:(k)_{10}=(....)_2

        那么  k = 2^{x_1}+2^{x_2} + ... +2^{x_t}\ \ \ x_t<=log_2k

        因此  a^k \ =\ a^{2^{x_1}+2^{x_2}+...+2^{x_t}} \ \ \ x_t<=log_2k

        我们可以把 a^k 拆分成  a^k \ =\ a^{2^{x_1}} * a^{2^{x_2}} *... * a^{2^{x_t}} \ \ \ x_t<=log_2k 

        因此我们只需要预处理出下面的,就可以解决上述方法:

         a^{2^0} \ mod \ p\\a^{2^1} \ mod\ p\\a^{2^2}\ mod\ p\\.\\.\\a^{2^{logk}}\ mod \ p

        如何求解这些需要预处理:

        每次乘2

        

qmi(long a,long k,long p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p; // 如果该位是1k = k>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);
}

         该代码使用了一种位运算技巧。

        位运算---求n的二进制表示中第k位是1还是0 (lowbit)-CSDN博客

例子:

 

 

标准例题代码: 

给定 n 组 ai,bi,pi,对于每组数据,求出 a_i^{b_i}\ mod\ p_i 的值。

输入格式

第一行包含整数 n。

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

输出格式

对于每组数据,输出一个结果,表示 a_i^{b_i}\ mod\ p_i 的值。

每个结果占一行。

数据范围

1≤n≤100000,
1≤ai,bi,pi≤2×10^9

输入样例:

2
3 2 5
4 3 9

输出样例:

4
1

import java.util.*;
import java.io.*;class Main{static final int N = 100010;static int n;public static void main(String[] args) throws IOException{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(in.readLine());while(n-->0){String[] s = in.readLine().split(" ");long a = Long.parseLong(s[0]);long b = Long.parseLong(s[1]);long p = Long.parseLong(s[2]);qmi(a,b,p); // 快速幂}}public static void qmi(long a,long b,long p){long res = 1;while(b!=0){if((b&1)==1) res = res*a%p; // 如果该位是1b = b>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);}
}

例题:快速幂求逆元

        费马定理。

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

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

乘法逆元的定义

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

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

输入格式

第一行包含整数 n。

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

输出格式

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

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

数据范围

1≤n≤10^5,
1≤ai,pi≤2∗10^9

输入样例:

3
4 3
8 5
6 3

输出样例:

1
2
impossible

解决方法:

         \frac{a}{b}\equiv a*x\ (mod \ m)

       由题意可知: \frac{a}{b}\equiv a*b^{-1}\ (mod \ m)

        {a}\equiv a*b*b^{-1}\ (mod \ m)

        b*b^{-1}\equiv 1\ (mod \ m)

        x 为 b 的模 m 乘法逆元,记为 b^{-1}\ (mod\ m),因此 b*x\equiv 1\ (mod \ m)

        由费马定理可知:

                ​​​​​​​        ​​​​​​​        b^{p-1}\ \equiv \ 1\ (mod\ p)\\b*b^{p-2} \ \equiv \ 1\ (mod\ p)

        因此,x = b^{p-2}\ (mod \ p)

        再使用快速幂解决:

import java.util.*;
import java.io.*;
class Main{static int n;public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(br.readLine());while(n-->0){String[] s = br.readLine().split(" ");int a = Integer.parseInt(s[0]);int p = Integer.parseInt(s[1]);long res = qmi(a,p-2,p);if(a%p==0) System.out.println("impossible");else System.out.println(res);}}public static long qmi(int a,int k,int p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p;k = k>>1;a = (int)((long)a*a%p);}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码流程引擎实战:让表单字段成为流程节点审批人的得力助手!

在现代企业的日常运营中&#xff0c;流程审批是保障工作高效、规范进行的关键环节。随着企业对于灵活性和高效性的需求不断增长&#xff0c;传统的固定审批人设置已无法满足多变的业务场景。在JVS低代码中“设置流程节点审批人为表单字段”这一功能&#xff0c;旨在通过动态配置…

C#入门:简单数据类型和强制类型转换

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 本期来讲讲 unity 的脚本语言 —C#&#xff0c;C# 的简单数据类型及范围和强制类型转化的方法。这可是 unity 游戏开发必备技能。 1. 简单数据类型 各个类型的范围&#xff1a; byte -> System.Byte (字节…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

网络问题排查必备利器:Pingmesh

背景 当今的数字化世界离不开无处不在的网络连接。无论是日常生活中的社交媒体、电子商务&#xff0c;还是企业级应用程序和云服务&#xff0c;我们对网络的依赖程度越来越高。然而&#xff0c;网络的可靠性和性能往往是一个复杂的问题&#xff0c;尤其是在具有大规模分布式架…

21.Prometheus的查询数据类API

平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~ 1.数据查询类API 1.1.API前缀路径说明 …

lanqiao:42点

题解&#xff1a; 1.首先&#xff0c;把字符转成数字。 2.创建二维数组存放枚举的结果&#xff0c;第一行一个数字13&#xff1b;第二行4个数字&#xff0c;分别是13和1的加减乘除&#xff1b;第三行16个数字&#xff0c;分别是第二行的每个数和12加减乘除的结果&#xff1b;…

基于SpringBoot的在线拍卖系统

目录 1、 前言介绍 2、主要技术 3、系统流程和逻辑 4、系统结构设计 5、数据库设计表 6、运行截图(部分) 6.1管理员功能模块 6.2用户功能模块 6.3前台首页功能模块 7、源码获取 基于SpringBoot的在线拍卖系统录像 1、 前言介绍 随着社会的发展&#xff0c;社会的各行…

安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析

在以往玩机过程中。很多机型备份分区 备份固件需要借助adb手动指令或者第三方手机软件或者特定的一些工具来操作。有些朋友需要查看当前机型分区名称和对应的分区号。此类操作我前面的博文专门说过对应的adb指令。但有些界面化的工具比较方便简单。 相关分区同类博文&#xff…

【C++】每周一题——2024.3.3(手滑再再写一篇)

题目 Cpp 【问题描述】 求N个字符串的最长公共子串&#xff0c;2 < N&#xff1c;&#xff1d;20&#xff0c;字符串长度不超过255。 例如&#xff1a;N&#xff1d;3&#xff0c;由键盘依次输入三个字符串为 What is local bus? Name some local buses. local bus is a h…

SpringBoot源码解读与原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程

文章目录 前言12.4 DispatcherServlet的工作全流程12.4.1 DispatcherServlet#service12.4.2 processRequest12.4.3 doService12.4.3.1 isIncludeRequest的判断12.4.3.2 FlashMapManager的设计 12.4.4 doDispatch12.4.4.1 处理文件上传请求12.4.4.2 获取可用的Handler&#xff0…

sscanf 函数的用法

sscanf 函数是 C 语言标准库 <stdio.h> 中的一个函数&#xff0c;用于按照指定的格式从一个字符串中读取输入。它的用法类似于 scanf 函数&#xff0c;但是 sscanf 从字符串中读取输入&#xff0c;而不是从标准输入&#xff08;键盘&#xff09;中读取输入。 以下是 ssc…

优优嗨聚集团:美团代运营服务,商家增长的新引擎

在当今数字化时代&#xff0c;线上平台已成为商家拓展业务、提升品牌影响力的重要渠道。美团作为国内领先的本地生活服务平台&#xff0c;拥有庞大的用户群体和丰富的商业资源。然而&#xff0c;对于许多商家而言&#xff0c;如何在美团平台上进行有效运营&#xff0c;实现业务…

Redis做分布式锁如何处理超时时间?

在使用Redis实现分布式锁时&#xff0c;处理超时时间是非常重要的&#xff0c;以确保在获取锁的客户端在一定时间内未能完成任务时&#xff0c;锁能够自动释放&#xff0c;避免造成死锁或长时间的阻塞。下面是一种处理超时时间的方法&#xff1a; 获取锁时设置超时时间&#xf…

双线服务器有哪些安全防御措施?

双线服务器的出现给企业带来了更广泛的业务发展&#xff0c;用户不再是固定的群体&#xff0c;而是有了一定的选择性&#xff0c;服务器的性能与可靠性进行了增强&#xff0c;使网络的运行速度变得更加流畅&#xff0c;给用户带来了良好的体验感。 今天我们主要就来聊一聊双线服…

【IOS】启动报错Cannot launch ‘/private/var/containers/Bundle/Application/....‘

问题 IOS项目启动报错Cannot launch ‘/private/var/containers/Bundle/Application/***.app’: Sending qLaunchSuccess packet failed 或者类似报错问题 无法启动launch的 解决 问题定位 我是在操作期间更换了应用的签名证书 也就是Signing & Capablities -> Sign…

【LeetCode:232. 用栈实现队列 + 栈 | 队列】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

力扣74. 搜索二维矩阵(二分查找)

Problem: 74. 搜索二维矩阵 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;映射为一维数组二分查找 1.由于题目矩阵中的元素整体是升序的&#xff0c;我们可以将其放置在一个大小为 m n m \times n mn的一维数组array中进行二分查找 2.对应的映射关系是ar…

NACOS在Windows和Linux下的安装教程

目录 1、Windows安装 1.1、下载安装包 1.2、解压 1.3、端口配置 1.4、启动 1.5、访问 2、Linux安装 2.1、安装JDK 2.2、上传安装包 2.3、解压 2.4、端口配置 2.5、启动 3、Nacos的依赖 1、Windows安装 开发阶段采用单机安装即可。 1.1、下载安装包 在Nacos的Git…

Vue+SpringBoot打造图书借阅系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 图书管理模块2.3 图书评论模块2.4 图书预定模块2.5 图书资讯模块 三、系统设计3.1 系统结构设计3.1.1登陆注册模块的结构设计3.1.2图书管理模块的结构设计3.1.3图书评论模块的结构设计3.1.4图书预定模块…