Acwing 快速幂

news2024/9/29 15:30:43

1.快速幂

作用:可以快速求出 a k m o d p a^k mod p akmodp的值,时间复杂度是 O ( l o g k ) . O( log k). O(logk).
核心思路:反复平方法
①预处理出: a 2 0 m o d   p 、 a 2 1 m o d   p 、 a 2 2 m o d   p 、 … 、 a 2 log ⁡ 2 k m o d   p 一共 l o g 2 k 个数 对于这预处理出的数,观察可以发现: a 2 1 = ( a 2 0 ) 2 、 a 2 2 = ( a 2 1 ) 2 、 a 2 3 = ( a 2 2 ) 2 、 … 、 a 2 l o g 2 k = ( a 2 l o g 2 k − 1 ) 2 . 即每个数是前面一个数的平方 ②对于 a k ,可将 a k 拆成 a k = a 2 x 1 × a 2 x 2 × ⋯ × a 2 x t = a 2 x 1 + 2 x 2 + ⋯ + 2 x t 可得到 k = 2 x 1 + 2 x 2 + ⋯ + 2 x t  ,即 k 为 l o g 2 k 个数之和 ​那么 a k m o d   p = ( a 2 x 1 m o d   d ) ∗ ( a 2 x 2 m o d   d ) . . . ( a 2 x t m o d   d ) 再由①中得到的每个数是前一个数的平方,故 a k m o d   p = ( a 2 x 1 m o d   d ) ∗ [ ( a 2 x 1 m o d   d ) ] 2 m o d   d   ∗ . . . ∗ ( 前一个结果的平方 m o d   d ) ③对于怎么得到 a k = a 2 x 1 + 2 x 2 + ⋯ + 2 x t ,简单,直接取 k 的二进制数。 如求 4 5 m o d   10 ,则 k = ( 101 ) 2 ,那么 4 5 = 4 ( 101 ) 2 = 4 2 0 × 4 2 2 而 4 2 0 m o d   10 = 4 , 4 2 1 m o d   10 = 4 2 m o d   10 = 6 , 4 2 2 m o d   10 = 6 2 m o d   10 = 6 , ( 这里就体现了后面的结果为前一个结果的平方再取模 ) 得到最终结果即为 4 5 m o d   10 = 4 ∗ 6   m o d   10 = 4 ①预处理出:a^{2^{0}} mod\ p、a^{2^{1}} mod\ p、a^{2^{2}} mod\ p、\dots、a^{2^{\log_{2}{k} }} mod\ p 一共log_{2}{k}个数\\ 对于这预处理出的数,观察可以发现:a^{2^{1}}=(a^{2^{0}})^2、a^{2^{2}}=(a^{2^{1}})^2、a^{2^{3}}=(a^{2^{2}})^2、\dots、a^{2^{log_{2}{k}}}=(a^{2^{log_{2}{k}-1}})^2.\\即每个数是前面一个数的平方\\ ②对于a^{k},可将 a^{k} 拆成 a^{k} = a^{2^{x_{1}}} \times a^{2^{x_{2}}} \times \dots \times a^{2^{x_{t}}} = a^{2^{x_{1}}+2^{x_{2}}+\dots+2^{x_{t}}}\\可得到k=2^{x_{1}}+2^{x_{2}}+\dots+2^{x_{t}}\ ,即k为log_{2}{k}个数之和\\​那么a^{k} mod\ p=(a^{2^{x_{1}}}mod \ d)*(a^{2^{x_{2}}}mod \ d)...(a^{2^{x_{t}}}mod \ d)\\再由①中得到的每个数是前一个数的平方,故a^{k} mod\ p=(a^{2^{x_{1}}}mod \ d)*[(a^{2^{x_{1}}}mod \ d)]^2 mod\ d\ * ...*\\(前一个结果的平方mod\ d)\\\\③对于怎么得到a^{k}=a^{2^{x_{1}}+2^{x_{2}}+\dots+2^{x_{t}}},简单,直接取k的二进制数。\\ \\如求4^5 mod \ 10,则k=(101)_2,那么4^{5}=4^{(101)_{2}}=4^{2^{0}}\times 4^{2^{2}}\\而4^{2^{0}} mod\ 10=4,4^{2^{1}}mod\ 10=4^2 mod \ 10=6,4^{2^{2}}mod\ 10=6^2 mod \ 10=6,\\(这里就体现了后面的结果为前一个结果的平方再取模)\\得到最终结果即为4^5 mod \ 10=4*6 \ mod \ 10=4 预处理出:a20mod pa21mod pa22mod pa2log2kmod p一共log2k个数对于这预处理出的数,观察可以发现:a21=(a20)2a22=(a21)2a23=(a22)2a2log2k=(a2log2k1)2.即每个数是前面一个数的平方对于ak,可将ak拆成ak=a2x1×a2x2××a2xt=a2x1+2x2++2xt可得到k=2x1+2x2++2xt ,即klog2k个数之和那么akmod p=(a2x1mod d)(a2x2mod d)...(a2xtmod d)再由中得到的每个数是前一个数的平方,故akmod p=(a2x1mod d)[(a2x1mod d)]2mod d ...(前一个结果的平方mod d)对于怎么得到ak=a2x1+2x2++2xt,简单,直接取k的二进制数。如求45mod 10,则k=(101)2,那么45=4(101)2=420×422420mod 10=4421mod 10=42mod 10=6422mod 10=62mod 10=6(这里就体现了后面的结果为前一个结果的平方再取模)得到最终结果即为45mod 10=46 mod 10=4

Acwing 875.快速幂

在这里插入图片描述
具体实现代码(详解版):

#include <iostream> 
using namespace std; 

typedef long long LL; 

// 快速幂函数:计算 m^k % p
LL qmi(int m, int k, int p) {
    // res 初始化为 1 % p,确保即使 p == 1 也能正常工作(防止 p = 1 时除 0 错误)
    int res = 1 % p; 
    int t = m; // t 是当前的底数,从 m 开始

    // 当 k 不为 0 时,继续循环
    while (k) {
        // 如果 k 的最低位是 1,意味着当前需要将 t 乘到结果中
        if (k & 1) 
            res = (LL)res * t % p; // 计算 (res * t) % p,并更新 res

        // 无论 k 的最低位是否为 1,都要将 t 平方,并取模 p
        t = (LL)t * t % p;

        // 右移 k,去掉最低位,这相当于将 k 除以 2
        k >>= 1;
    }

    // 返回最终的结果,即 m^k % p
    return res;
}

int main() {
    int n; 
    cin >> n; 
    
    while (n--) {
        int m, k, p;
        cin >> m >> k >> p; 
        cout << qmi(m, k, p) << endl; // 输出 m^k % p 的结果
    }

    return 0;
}

2.快速幂求逆元

Acwing 快速幂求逆元

在这里插入图片描述
实现思路:

  • 由(a/b)mod m恒等a*x mod m===>(b*x) mod m = 1 ,x为b的逆元
  • 结合费马定理(欧拉函数的应用):b与m互质,且m为质数,则b^(m-1) mod m=1;
  • 上面两式结合:得b的逆元b^(m-2),则模m乘法逆元x=b^(m-2)%m本质上就是求快速幂,但多了一个要求:b和m互质
  • 注意:当b和m不互质时,无解;否则必存在逆元

具体实现代码(详解版):

#include <iostream> 
using namespace std; 

typedef long long LL; // 定义 LL 为 long long 类型,用于处理大整数

// 快速幂函数:计算 m^k % p
LL qmi(int m, int k, int p) {
    // res 初始化为 1 % p,确保即使 p == 1 也能正常工作(防止 p = 1 时除 0 错误)
    int res = 1 % p; 
    int t = m; // t 是当前的底数,从 m 开始
    
    // 当 k 不为 0 时,继续循环
    while (k) {
        // 如果 k 的最低位是 1,意味着当前需要将 t 乘到结果中
        if (k & 1) 
            res = (LL)res * t % p; // 计算 (res * t) % p,并更新 res
        
        // 无论 k 的最低位是否为 1,都要将 t 平方,并取模 p
        t = (LL)t * t % p;
        
        // 右移 k,去掉最低位,这相当于将 k 除以 2
        k >>= 1;
    }
    
    // 返回最终的结果,即 m^k % p
    return res;
}

int main() {
    int n; 
    cin >> n; 
    
   
    while (n--) {
        int m, p;
        cin >> m >> p; // 读取基数 m 和模数 p
        
        // 根据费马小定理计算 m 的模逆元,公式为 m^(p-2) mod p
        int res = qmi(m, p - 2, p);
        
        // 检查 m 是否与 p 互质(即 m % p 不为 0)
        if (m % p) 
            cout << res << endl; // 如果互质,输出结果
        else 
            puts("impossible"); // 如果不互质,输出 "impossible"
    }
    
    return 0; 
}

快速幂的应用:
在这里插入图片描述

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

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

相关文章

IOT-research虚拟机的中文语言设置

首先在setting&#xff08;设置&#xff09;中找到Region & Langguage 在Input Source中添加Chinese ubuntu 卡在waiting for unattended-upgr to exit的解决 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend …

数据库管理-第245期 主流国产数据库RAC架构概览(20240929)

数据库管理245期 2024-09-29 数据库管理-第245期 主流国产数据库RAC架构概览&#xff08;20240929&#xff09;1 DMDSC2 KingBaseES RAC3 PolarDB4 Cantian5 HaloDB DLB/Data Sharding总结 数据库管理-第245期 主流国产数据库RAC架构概览&#xff08;20240929&#xff09; 作者…

HDFS不会自动退出安全模式问题

问题说明 Hadoop集群启动之后&#xff0c;HDFS进入了安全模式&#xff0c;并且不会自动退出&#xff0c;提示信息如下 Safe mode is ON. The reported blocks 1223 needs additional 3 blocks to reach the threshold 0.9990 of total blocks 1228. The minimum number of …

探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿

0.概述 论文地址&#xff1a;https://arxiv.org/abs/2404.06571 本研究探讨了制造系统集成商如何构建知识图谱来识别新的制造合作伙伴&#xff0c;并通过供应链多样化来降低风险。它提出了一种使用制造服务知识图谱&#xff08;MSKG&#xff09;提高 ChatGPT 响应准确性和完整…

[Python学习日记-32] Python 中的函数的返回值与作用域

[Python学习日记-32] Python 中的函数的返回值与作用域 简介 返回值 作用域 简介 在函数的介绍中我们提到了函数的返回值&#xff0c;当时只是做了简单的介绍&#xff0c;下面我们将会进行详细的介绍和演示&#xff0c;同时也会讲一下 Python 中的作用域&#xff0c;作用域分…

fmql之Linux中断

中断 下半部机制 软中断 softirq_action tasklet 工作队列 设备树 fmql&#xff1a; 代码 目的 使能key对应GPIO的中断&#xff0c;中断服务函数为使用定时器延时15ms&#xff1b;定时器处理函数为检测key的状态 设备树修改 fmql不用把system.dtb放到SD卡。修改设备树后要在…

【RocketMQ】初识

基础概念 Message&#xff08;消息&#xff09;&#xff1a;Message 是 RocketMQ 传输的基本单元&#xff0c;包含了具体的业务数据以及一些元数据&#xff08;如消息 ID、主题、标签、发送时间等&#xff09;。消息可以是文本、二进制数据或其他任何序列化后的对象形式。Topi…

MDIO Frame介绍

在MII管理界面上传输的框架应具有表22-10所示的框架结构。位传输顺序从左到右。 IDLE (IDLE condition) MDIO上的空闲条件是高阻抗状态。所有三个状态驱动器都应被禁用,而PHY的上拉电阻器将把MDIO线拉到一个逻辑线上。 PRE (preamble) 32位前导码,都是 1 ST (start of frame…

基于Springmvc的网上书城的设计与实现

文未可获取一份本项目的java源码和数据库参考 选题意义&#xff1a; 网上书城是以当前商务的网络化、快速化实际需求为背景&#xff0c;实现图书购买的方便、快捷、送货上门等服务为前提综合信息服务系统的设计&#xff1b;实现通过Internet互联网对图书购买的相关信息进行发…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序对象什么是对象对象的创建一、类加载检查二、对象内存分配三、初始化零值四、设置对象头五、执行初始化方法 对象的访问定位 对象与类的关系由类创建对象的顺序 对象的创建 前言 一个程序需要运行&#xff0…

编程语言图书创作要注意的事情有哪些?

编程语言图书的创作是一项复杂且具有挑战性的任务&#xff0c;需要作者深入理解技术、清晰表达&#xff0c;并考虑读者的学习体验。一本优秀的编程书籍不仅能够教授技术知识&#xff0c;更能引导读者逐步深入&#xff0c;激发他们的思考和实际应用能力。以下将详细探讨编程语言…

Python库matplotlib之三

Python库matplotlib之三 小部件(widget)小部件的基类connect_eventdisconnect_events() Buttondisconnecton_clicked应用实列 CheckButtons构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例&#xff0c;并将…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中&#xff0c;执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中&#xff0c;我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1&#xff1a;创建 EmailMessage 类 首先&#xff0c…

工作繁杂,如何防止工作遗漏遗忘?

不知道大家工作中是否有这样的情况&#xff1a; 1.工作过程中工作任务经常被打断&#xff0c;打乱正常的工作节奏&#xff1b; 2.因为不方便统一记录工作及工作要求&#xff0c;经常忘记给领导反馈工作进展&#xff1b; 3.因为工作繁多&#xff0c;经常会出现工作遗漏遗忘的…

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?视频加字幕超简单!

ass字幕文件怎么导入视频mp4&#xff1f;ass字幕怎么编辑&#xff1f;在视频制作和观看过程中&#xff0c;添加字幕是一项常见的需求&#xff0c;特别是对于外语视频或需要辅助阅读的场景。ASS&#xff08;Advanced SubStation Alpha&#xff09;字幕文件是一种常用的字幕格式&…

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库&#xff0c;专为简化在分布式环境中的Java开发而设计。通过Redisson&#xff0c;开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象&#xff0c;并处理各种分布式场景的挑战。 Redisson的设计灵感来…

华为OD机试 - 静态扫描(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

八LAMP搭建

# LAMP ## 一、知识回顾 ### FTP samba nfs 特点 - 借用Linux用户作为映射用户&#xff0c;进行权限管理 - 软件本身还有管理控制权限 #### 客户端连接到服务器后进行读写执行等操作 &#xff0c;必须同时具有: - 软件许可的权限 vsftpd: anon upload enableYES - 文件…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序&#xff0c;没有出现调试的界面&#xff1a;点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试&#xff0c;改完代码没反应再刷新看看&#xff0c;再没反应就再次重新点击编译并自动调试。

fish-speech语音大模型本地部署

文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧&#xff0c;可以先看下官网。如下&#xff1a; 这就是一个模型&#xff0c;可以根据一个样例声音&#xff0c;构建出自己需要的声音。其实&#xff0c;这个还是有很多用途的&#xff1b;…