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

数学-快速幂

从一个简单的问题说起:

给出整数m,n和p,要求计算(m ^ n) % p的结果。

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1;for (long long i = 0; i < n; i++) {ans = ans * m;}cout << ans << "\n";return 0;
}

 这个程序似乎正确了,但是存在严重问题:

<1>.m或n太大,极容易溢出.

<2>.如果n的值太大,时间消耗O(n)代价较大.

首先解决溢出的问题:

显然:

(a * b) % c = ((a  % c)  * (b % c)) % c.

这样,就可以把程序改写为如下形式:

但是,如果n的值太大,时间消耗O(n)代价太大,这个问题如何解决呢? 

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1;for (long long i = 0; i < n; i++) {ans = ((ans % p) * (m % p)) % p;}cout << ans << "\n";return 0;
}

乘方快速幂:

假设要计算 m^10,m^10 = (m^5) ^ 2 = (m * (m ^ 2) ^ 2) ^ 2.

也就是说,要计算m ^ n,有: 

 那么,程序就变成了:

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1;while (n) {if (n % 2 != 0) {ans = ((ans % p) * (m % p)) % p;}n = n / 2;m = ((m % p) * (m % p)) % p;}cout << ans << "\n";return 0;
}

但是,对于这个程序,我们仍可以继续对其优化:

首先介绍一下 按位与运算(&) 与 右移运算(>>):

<1>.按位与运算:

对于两个二进制数,它们按位与运算的结果是: 对于每一位,如果两个数的这一位同时为1,那么按位与的结果便是1,否则为0,最后将结果转化为十进制,就是我们想要的答案了。 对于一个整数,如果它是奇数,那么它的二进制表示的最低位为1,否则为0,那么对于奇数而言,其按位与1的结果是1,对于偶数而言,其按位与1的结果是0,由此我们可以通过判断一个整数按位与1的结果来判断其是偶数还是奇数.

<2>.右移运算:

同样是对2进制数进行处理,将所有位置上的数字右移,高位补0:如5:101,右移一位为010,结果是2。则:对于一个整数而言,右移一位,相当于其除以2并向下取整。

我们可以根据这两个运算来初步优化程序:

即将 n % 2 != 0 改为 n & 1 == 1,将 n = n / 2 改为 n = n >> 1.

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1;while (n) {if (n & 1) {ans = ((ans % p) * (m % p)) % p;}n = n >> 1;m = ((m % p) * (m % p)) % p;}cout << ans << "\n";return 0;
}

对于m ^ 0,结果为1,1 % 1 == 0,所以,我们应该要防止这种特殊情况,即在进行乘方运算之前,先将ans % p: 

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1 % p;while (n) {if (n & 1) {ans = ((ans % p) * (m % p)) % p;}n = n >> 1;m = ((m % p) * (m % p)) % p;}cout << ans << "\n";return 0;
}

因为C++内置的最高整数类型是64位,若运算 (a ^ b) % p中的三个变量a,b,p都在10^18级别,则不存在一个可供强制转化的128位整数类型,我们需要一些特殊的处理办法:

进行乘方运算之前,先让m对p取模一次: 

#include <iostream>
using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans = 1 % p;m %= p;while (n) {if (n & 1) {ans = ((ans % p) * (m % p)) % p;}n = n >> 1;m = ((m % p) * (m % p)) % p;}cout << ans << "\n";return 0;
}

这样就是最优的形式了。 

下面给出几道相关的练习题: 

Raising Modulo Numbers

我们可以计算每一项a^b的值,然后将其加起来作为结果: 

#include <iostream>
#define i64 long longi64 qpow(i64 a, i64 b, i64 p) {i64 ans = 1 % p;a %= p;while (b) {if (b & 1) {ans = ((ans % p) * (a % p)) % p;}b >>= 1;a = ((a % p) * (a % p)) % p;}return ans;
}int main() {int t; std::cin >> t;while (t--) {i64 M;std::cin >> M;i64 H, ans = 0;std::cin >> H;for (int i = 0; i < H; i++) {i64 A, B;std::cin >> A >> B;ans = ((ans % M) + (qpow(A, B, M) % M)) % M;}std::cout << ans << "\n";}return 0;
}

Pseudoprime numbers

题意:

输入p 和 a,如果p不是质数,并且a>1并且(a^p) % p == a % p,那么输出yes,否则输出no

参考代码:

#include <iostream>
using namespace std;bool isprime(long long n) {if (n < 2) {return false;}for (int i = 2; i <= n / i; i++) {if (n % i == 0) {return false;}}return true;
}long long qpow(long long m, long long n, long long p) {long long ans = 1 % p;while (n) {if (n & 1) {ans = ((ans % p) * (m % p)) % p;}n = n >> 1;m = ((m % p) * (m % p)) % p;}return ans;
}int main() {long long p, a;while (cin >> p >> a && p && a) {if (isprime(p) == false && qpow(a, p, p) == a % p && a > 1) {cout << "yes\n";} else {cout << "no\n";}}return 0;
}

方阵快速幂: 

 

 

 

相关文章:

数学-快速幂

从一个简单的问题说起&#xff1a; 给出整数m&#xff0c;n和p&#xff0c;要求计算(m ^ n) % p的结果。 #include <iostream> using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans 1;for (long long i 0; i < …...

DevEco鸿蒙应用开发-第一个App

目录下载开发环境创建工程登录华为账户测试应用下载开发环境 前往官网下载 DevEco 开发环境&#xff1a;https://developer.harmonyos.com/cn/develop/deveco-studio#download 下载并安装&#xff0c;请记住你选择的 IDE 与 SDK 安装位置&#xff0c;后续可能会用到&#xff…...

又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费

chartgpt大火之后&#xff0c;随之而来的就是一大类衍生物了。 然后&#xff0c;今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费&#xff0c;我们可以直接利用它来辅助我们编程&#xff0c;真正做到事半功倍。 注意&#…...

CSS的浮动(下)

&#x1f31f;所属专栏&#xff1a;前端只因变凤凰之路&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新前端的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简…...

软件测试-性能测试流程

压测任务具体包含: 0.前期准备 尽量参与业务需求评审,可以对业务有更深入的了解,了解哪些功能是核心功能,哪些可能存在性能瓶颈,以便在性能需求评审的时候能给出有建设性的意见 1.性能需求分析、评审 明确测试范围(哪些业务接口)、目标(tps、rt、成功率) 关于性能需…...

【python实操】年轻人,别用记事本保存数据了,试试数据库吧

为什么用数据库&#xff1f; 数据库比记事本强在哪&#xff1f; 答案很明显&#xff0c;你的文件很多时候都只能被一个人打开&#xff0c;不能被重复打开。当有几百万数据的时候&#xff0c;你如何去查询操作数据&#xff0c;速度上要快&#xff0c;看起来要清晰直接 数据库比我…...

铁威马NAS教程之利用docker快速搭建个人在线书库

这是一个基于Calibre的简单的图书管理系统&#xff0c;支持在线阅读。主要特点是&#xff1a;美观的界面、支持多用户、支持在线阅读、支持邮件推送、支持OPDS、支持一键安装&#xff0c;网页版初始化配置&#xff0c;轻松启动网站等等。 那么&#xff0c;如何利用docker快速搭…...

504. 七进制数——【Leetcode每日一题】

504. 七进制数 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: “202” 示例 2: 输入: num -7 输出: “-10” 提示&#xff1a; −107<num<107-10^7 < num < 10^7−107<num<107 思路&…...

RocketMQ源码(24)—DefaultMQPushConsumer延迟消息源码

基于RocketMQ release-4.9.3&#xff0c;深入的介绍了DefaultMQPushConsumer延迟消息源码。 文章目录1 load加载延迟消息数据1.1 parseDelayLevel解析延迟等级2 start启动调度消息服务3 DeliverDelayedMessageTimerTask投递延迟消息任务3.1 executeOnTimeup执行延迟消息投递3.2…...

计算机视觉知识点(一)——交并比(IoU)及其若干改进

交并比&#xff08;IoU&#xff09;前言IoU公式及示意图IoU Loss缺点GIoU Loss公式及示意图缺点DIoU公式及示意图CIoU前言 目标检测是一个常见的计算机视觉任务&#xff0c;在目标检测任务中&#xff0c;交并比作为评判检测框的标准具有很重要的意义&#xff0c;在实际的应用中…...

一篇文章教你从零到一搭建自动化测试框架(附视频教程+源码)

目录 前言 1. 什么是自动化测试框架&#xff1f; 2. 没有万能的测试框架&#xff0c;适合自己项目的&#xff0c;能提高工作效率的就是好框架。 3. 设计框架的思路&#xff1a; 4.如何开展自动化测试 前言 关于测试框架的好处&#xff0c;比如快速回归提高测试效率&#x…...

【备战蓝桥杯】----01背包问题(动态规划)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

Golang1.18新特性介绍——泛型

社区长期高呼的泛型特性在Golang 1.18中终于正式发布&#xff0c;Go泛型实现与传统的C有较大差异&#xff0c;更像Rust的泛型实现。本文详细介绍Golang泛型及其特性&#xff0c;包括泛型语法、类型参数、类型约束、类型近似以及constraints包提供内置类型等。 最近写Dao代码&am…...

【SpringBoot17】SpringBoot中使用Quartz管理定时任务

定时任务在系统中用到的地方很多&#xff0c;例如每晚凌晨的数据备份&#xff0c;每小时获取第三方平台的 Token 信息等等&#xff0c;之前我们都是在项目中规定这个定时任务什么时候启动&#xff0c;到时间了便会自己启动&#xff0c;那么我们想要停止这个定时任务的时候&…...

杨辉三角形 (蓝桥杯) JAVA

目录题目描述&#xff1a;暴力破解&#xff08;四成&#xff09;&#xff1a;二分法破解&#xff08;满分&#xff09;&#xff1a;题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如…...

AI制药 - AlphaFold Multimer 的 MSA Pairing 源码

目前最新版本是v2.3.1&#xff0c;2023.1.12 AlphaFold multimer v1 于 2021 年 7 月发布&#xff0c;同时发表了一篇描述其方法和结果的论文。AlphaFold multimer v1 使用了与 AlphaFold 单体相同的模型结构和训练方法&#xff0c;但增加了一些特征和损失函数来处理多条链。Al…...

TitanIDE:云原生开发到底强在哪里?

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法&#xff0c;旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同&#xff0c;云原生是将开发环境完全搬到云端&#xff0c;构建一站式的云原生开发环境。云原生的开…...

单片机常用完整性校验算法

一、前言 单片机在开发过程中经常会遇到大文件传输&#xff0c;或者大量数据传输&#xff0c;在一些工业环境下&#xff0c;数据传输并不是很稳定&#xff0c;如何检验数据的完整性就是个问题&#xff0c;这里简单介绍一下单片机常用的几种数据完整性校验方法。 二、CheckSum校…...

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前&#xff0c;我们必须先明白anaconda是什么&#xff1b;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言&#xff0c;后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…...

p84 CTF夺旗-PHP弱类型异或取反序列化RCE

数据来源 文章参考 本课重点&#xff1a; 案例1&#xff1a;PHP-相关总结知识点-后期复现案例2&#xff1a;PHP-弱类型对比绕过测试-常考点案例3&#xff1a;PHP-正则preg_match绕过-常考点案例4&#xff1a;PHP-命令执行RCE变异绕过-常考点案例5&#xff1a;PHP-反序列化考题…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...