数学-快速幂
从一个简单的问题说起:
给出整数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;
}
方阵快速幂:
相关文章:

数学-快速幂
从一个简单的问题说起: 给出整数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 < …...
DevEco鸿蒙应用开发-第一个App
目录下载开发环境创建工程登录华为账户测试应用下载开发环境 前往官网下载 DevEco 开发环境:https://developer.harmonyos.com/cn/develop/deveco-studio#download 下载并安装,请记住你选择的 IDE 与 SDK 安装位置,后续可能会用到ÿ…...

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

CSS的浮动(下)
🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…...
软件测试-性能测试流程
压测任务具体包含: 0.前期准备 尽量参与业务需求评审,可以对业务有更深入的了解,了解哪些功能是核心功能,哪些可能存在性能瓶颈,以便在性能需求评审的时候能给出有建设性的意见 1.性能需求分析、评审 明确测试范围(哪些业务接口)、目标(tps、rt、成功率) 关于性能需…...

【python实操】年轻人,别用记事本保存数据了,试试数据库吧
为什么用数据库? 数据库比记事本强在哪? 答案很明显,你的文件很多时候都只能被一个人打开,不能被重复打开。当有几百万数据的时候,你如何去查询操作数据,速度上要快,看起来要清晰直接 数据库比我…...

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

504. 七进制数——【Leetcode每日一题】
504. 七进制数 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 示例 1: 输入: num 100 输出: “202” 示例 2: 输入: num -7 输出: “-10” 提示: −107<num<107-10^7 < num < 10^7−107<num<107 思路&…...
RocketMQ源码(24)—DefaultMQPushConsumer延迟消息源码
基于RocketMQ release-4.9.3,深入的介绍了DefaultMQPushConsumer延迟消息源码。 文章目录1 load加载延迟消息数据1.1 parseDelayLevel解析延迟等级2 start启动调度消息服务3 DeliverDelayedMessageTimerTask投递延迟消息任务3.1 executeOnTimeup执行延迟消息投递3.2…...

计算机视觉知识点(一)——交并比(IoU)及其若干改进
交并比(IoU)前言IoU公式及示意图IoU Loss缺点GIoU Loss公式及示意图缺点DIoU公式及示意图CIoU前言 目标检测是一个常见的计算机视觉任务,在目标检测任务中,交并比作为评判检测框的标准具有很重要的意义,在实际的应用中…...

一篇文章教你从零到一搭建自动化测试框架(附视频教程+源码)
目录 前言 1. 什么是自动化测试框架? 2. 没有万能的测试框架,适合自己项目的,能提高工作效率的就是好框架。 3. 设计框架的思路: 4.如何开展自动化测试 前言 关于测试框架的好处,比如快速回归提高测试效率&#x…...

【备战蓝桥杯】----01背包问题(动态规划)
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...
Golang1.18新特性介绍——泛型
社区长期高呼的泛型特性在Golang 1.18中终于正式发布,Go泛型实现与传统的C有较大差异,更像Rust的泛型实现。本文详细介绍Golang泛型及其特性,包括泛型语法、类型参数、类型约束、类型近似以及constraints包提供内置类型等。 最近写Dao代码&am…...

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

杨辉三角形 (蓝桥杯) JAVA
目录题目描述:暴力破解(四成):二分法破解(满分):题目描述: 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如…...

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

TitanIDE:云原生开发到底强在哪里?
原文作者:行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法,旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同,云原生是将开发环境完全搬到云端,构建一站式的云原生开发环境。云原生的开…...
单片机常用完整性校验算法
一、前言 单片机在开发过程中经常会遇到大文件传输,或者大量数据传输,在一些工业环境下,数据传输并不是很稳定,如何检验数据的完整性就是个问题,这里简单介绍一下单片机常用的几种数据完整性校验方法。 二、CheckSum校…...

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

p84 CTF夺旗-PHP弱类型异或取反序列化RCE
数据来源 文章参考 本课重点: 案例1:PHP-相关总结知识点-后期复现案例2:PHP-弱类型对比绕过测试-常考点案例3:PHP-正则preg_match绕过-常考点案例4:PHP-命令执行RCE变异绕过-常考点案例5:PHP-反序列化考题…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <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的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

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

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