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

目录

反复平方法(快速幂):

代码: 

例题:快速幂求逆元


作用:

        快速求出 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; // 如果该位是1
        k = 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; // 如果该位是1
            b = 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人车辆检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5…

8.WEB渗透测试-Linux基础知识-Linux基础操作(二)

内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;7.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;一&#xff09;-CSDN博客 Tab键是补全命令&#xff0c;双击两下Tab键&#xff0c;会告诉你能补全的所有命令 文本编辑器指令&#xff1a;vi 输入vi 1…

技术派Redis实现作者白名单

通过技术派发文章的时候&#xff0c;发文章会先通过审核&#xff0c;只有通过审核在会在网站上进行展示。是不是所有的作者都要经过审核呢&#xff1f; 当然不是&#xff0c;在这里做了一个白名单&#xff0c;在白名单中的用户发文之后是不需要进入审核的&#xff0c;可以直接…

终于找到你!数字化时代的秘密武器

在数字化时代&#xff0c;纸张依旧扮演着重要的角色&#xff0c;无论是平板的电子笔记背景纸张&#xff0c;还是纸质纸张&#xff0c;亦或者你想要一个美观的纸张背景图。一张合适的纸张能大大提升我们的工作和学习效率。今天&#xff0c;我们将探索三款网站&#xff0c;它们可…

libreoffice免费的office软件

https://mirrors.ustc.edu.cn/tdf/libreoffice/stable/24.2.1/win/x86_64/LibreOffice_24.2.1_Win_x86-64.msi

Jetson Xavier NX 开发板Ubuntu18.04 安装arduino IDE详细步骤

Jetson 平台是arch架构&#xff0c;官网上面几乎都是x86或者arm64的这两种错误版本都存在匹配问题无法使用&#xff0c;不要下载不要下载&#xff01; uname -a #版本查询1.正确下载打开方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz选择自己想要下…

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

Vision Pro开发者学习路线

官方给到的Vision Pro开发者学习路线&#xff1a; 1. 学习基础知识&#xff1a; - 学习 Xcode、Swift 和 SwiftUI 的基础知识&#xff0c;包括语法、UI 设计等。 - 掌握 ARKit 和 SwiftUI 的使用&#xff0c;了解如何创建沉浸式增强现实体验。 2. 学习 3D 建模&#xf…

基于springboot+vue的网上服装商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

leetcode 热题 100_接雨水

题解一&#xff1a; 按列求&#xff1a;分别考虑每一列的雨水高度&#xff0c;某列的雨水高度只与其左侧最高墙和右侧最高墙有关&#xff0c;一种情况是该列比左右侧的墙都低&#xff0c;则根据木桶效应该列雨水高度为min(左侧墙高&#xff0c;右侧墙高)-列高&#xff0c;而其余…

Maven 学习与IDEA配置

(一) Maven 概述 [1]. 简介 Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目对象模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档 官网&#xff1a;http://maven.apache.org/ Maven是专门用于管理和构建Java项目的工具&#xff0…

算法43:动态规划专练(最长回文子串 力扣5题)---范围模型

之前写过一篇最长回文子序列的博客算法27&#xff1a;最长回文子序列长度&#xff08;力扣516题&#xff09;——样本模型 范围模型-CSDN博客 在那一篇博客中&#xff0c;回文是可以删除某些字符串组成的。比如&#xff1a; 字符串为&#xff1a;a1b3c4fdcdba&#xff0c; 那…

Typora旧版链接(Win+Mac+Linux版)

记得点赞本文&#xff01;&#xff01;&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1IckUvQUBzQkfHNHXla0zkA?pwd8888 提取码&#xff1a;8888 –来自百度网盘超级会员V7的分享

JavaWeb—— SpringBootWeb综合案例(登录功能、登录校验、异常处理)

案例-登录认证 目录 案例-登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1…

JS 对象数组排序方法测试

输出 一.Array.prototype.sort() 1.默认排序 sort() sort() 方法就地对数组的元素进行排序&#xff0c;并返回对相同数组的引用。默认排序是将元素转换为字符串&#xff0c;然后按照它们的 UTF-16 码元值升序排序。 由于它取决于具体实现&#xff0c;因此无法保证排序的时…

Zookeeper基础入门-1【集群搭建】

Zookeeper基础入门-1【集群搭建】 一、Zookeeper 入门1.1.概述1.2.Zookeeper工作机制1.3.Zookeeper特点1.4.数据结构1.5.应用场景1.5.1.统一命名服务1.5.2.统一配置管理1.5.3.统一集群管理1.5.4.服务器动态上下线1.5.5.软负载均衡 1.6.Zookeeper官网1.6.1.Zookeeper下载1.6.2.历…

软考56-上午题-【数据库】-数据库设计步骤2

一、回顾&#xff1a;数据库设计的步骤 1、用户需求分析&#xff1a;手机用户需求&#xff0c;确定系统边界&#xff1b; 2、概念设计&#xff08;概念结构设计&#xff09;&#xff1a;是抽象概念模型&#xff0c;较理想的是采用E-R方法。 3、逻辑设计&#xff1a;E-R图——…

带你了解 JavaScript 中的对象

带你了解 JavaScript 中的对象 基本概念 对象指的就是一个具体的事物&#xff0c;在JavaScript中, 字符串, 数值, 数组, 函数都是对象 每个对象中包含若干的属性和方法 属性: 事物的特征 方法: 事物的行为 1.使用字面量创建对象 使用{ }创建对象 属性和方法使用键值对的形式…

linux高级编程:线程(二)、进程间的通信方式

线程&#xff1a; 回顾线程&#xff08;一&#xff09;&#xff1a; 1.线程间通信问题 线程间共享同一个资源&#xff08;临界资源&#xff09; 互斥&#xff1a; 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量&#xff08;互斥锁&#xff09; 原子操作&#x…

1.1 简述卷积的基本操作,卷积和全连接层的区别?

1.1 简述卷积的基本操作&#xff0c;卷积和全连接层的区别&#xff1f; 摘要&#xff1a; 全连接层的输出层每个节点与输入层的所有节点连接。 卷积层具有局部连接和权值共享的特性。 问题&#xff1a;简述卷积的基本操作&#xff0c;并分析其与全连接层的区别。 分析与解答&a…