当前位置: 首页 > 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-反序列化考题…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...