快速幂、矩阵快速幂、快速乘法

快速幂

快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算。我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用for或者是pow就会超时,这时候就用到了快速幂。

快速幂的原理就是,当求b^p的时候,如果p是一个奇数,那么我们就可以把它拆成(b^2)^(p/2)*b,因此每次判断一下是直接乘还是拆开就可以了。

洛谷模板链接:https://www.luogu.org/problemnew/show/P1226

下面是代码:

#include<bits/stdc++.h>
using namespace std;
long long b,p,k;
void ksm(){long long ans=1,a=b,bb=b,pp=p;while(p){if(p&1) ans=ans*a%k; //判断要不要拆开p>>=1; //p除以2a=a*a%k;}printf("%lld^%lld mod %lld=%lld",bb,pp,k,ans%k);
}
int main(){scanf("%lld%lld%lld",&b,&p,&k);ksm();return 0;
}

 


矩阵快速幂

矩阵快速幂顾名思义就是把快速幂的整数换成矩阵,要学习矩阵快速幂,就要先知道矩阵的乘法规则。矩阵的乘法规则由下图所示:

注意:两个矩阵可以做乘法的条件是矩阵A的大小是N*M,矩阵B的大小是M*K,这样的两个矩阵相乘,得到矩阵C的大小是N*K。(通俗的说就是,第一个矩阵的列数等于另一个矩阵的行数)

矩阵的乘法有几个性质是很重要的,必须记住,不要搞混:①矩阵乘法满足乘法结合律 ②矩阵乘法满足乘法分配律(包括左分配律和右分配律,左分配律是:C*(A+B)=CA+CB,右分配律是:(A+B)*C=AC+BC) ③矩阵乘法不满足乘法交换律(例:AC!=CA)。

矩阵乘法的时间复杂度是O(NMK)的,下面是矩阵乘法的代码:

 

for(i=1;i<=n;++i)for(j=1;j<=m;++j)for(l=1;l<=k;++l)c[i][l]+=a[i][j]*b[j][l];

 

注意:在做矩阵乘法的时候,最好是按照我上面代码的循环顺序计算,因为如果你改变了循环顺序,速度就会变慢,如果你不相信的话可以去试一试,这是因为按照我代码的顺序,在计算一部分值之前,他的原值已经存在缓存中了,这样的话是比从内存中读取快的,而改变顺序的话,就会从内存中调用,就会变慢了。

学会了矩阵乘法,矩阵快速幂就很轻松了。因为矩阵快速幂和快速幂的区别就在于,一个是整数的次方运算,一个是矩阵的次方运算。但需要注意的是,在矩阵相乘的时候,要存在第三方数组中,这样才不会影响矩阵的值。

洛谷模板链接:https://www.luogu.org/problemnew/show/P3390

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1000;
const ll mod = 1e9+7;
ll n,k,a[M][M],b[M][M],c[M][M];
void jz(int x){register int i,j,l;if(x==1){for(i=1;i<=n;++i)for(j=1;j<=n;++j)for(l=1;l<=n;++l)c[i][l]=(c[i][l]+a[i][j]*b[j][l]%mod)%mod;for(i=1;i<=n;++i)for(j=1;j<=n;++j)b[i][j]=c[i][j];memset(c,0,sizeof c);}else{for(i=1;i<=n;++i)for(j=1;j<=n;++j)for(l=1;l<=n;++l)c[i][l]=(c[i][l]+a[i][j]*a[j][l]%mod)%mod;for(i=1;i<=n;++i)for(j=1;j<=n;++j)a[i][j]=c[i][j];memset(c,0,sizeof c); //记住每次要清空
    }
}
void ksm(){while(k){if(k & 1) jz(1);k>>=1;jz(2);}
}
int main(){register int i,j;scanf("%lld",&n);scanf("%lld",&k);for(i=1;i<=n;++i)for(j=1;j<=n;++j)scanf("%lld",&a[i][j]),b[i][j]=a[i][j];--k; //因为在上一句中,在答案中已经有了矩阵A的一次方
    ksm();for(i=1;i<=n;++i){for(j=1;j<=n;++j)printf("%lld ",b[i][j]);printf("\n");}return 0;
}

 


 

快速乘法

快速乘法和快速幂的思想差不多,KSM是把a^p的p二进制分解,而快速乘法是把a*b的b分解,一般和KSM配套食用。当KSM%p会超范围的时候,也就是取模之前就会乘爆,就要用到快速乘法。快速乘法就是把乘法改成加法,这样一步一步的取模,就不会出现乘爆的问题了。

因为没有找到例题,这里直接附上代码:

typedef long long ll;
ll ksmul(ll x,ll y,int p){ //x*y%pll ans=0;while(y){if(y & 1) ans=(ans+y)%p;y>>=1;x=(x+x)%p;}return ans;
}

 

转载于:https://www.cnblogs.com/Glacier-elk/p/9489655.html

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

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

相关文章

vue 前端显示图片加token_手摸手,带你用vue撸后台 系列二(登录权限篇)

完整项目地址&#xff1a;vue-element-adminhttps://github.com/PanJiaChen/vue-element-admin前言拖更有点严重&#xff0c;过了半个月才写了第二篇教程。无奈自己是一个业务猿&#xff0c;每天被我司的产品虐的死去活来&#xff0c;之前又病了一下休息了几天&#xff0c;大家…

注释工具_苹果已购丨Notability丨功能强大而简单易用的笔记及PDF注释工具

点击上方“天泽黑科技”右上角“...”点选“设为星标”点击加星★ 贴近你心 ❤今天给大家购买效率类排行第3名的 Notability &#xff01;大家在桌面 App store 登陆我的账号&#xff0c;搜索下载即可&#xff01;荣获 iPad、iPhone 和 Mac 的 Apple「编」爱新 App 殊荣&#x…

第四章 大网高级   NSSA

STUB、完全stub、NSSA、完全nssa实验要求&#xff1a;1、配置IP地址2、配置OSPF多区域3、配置 stub 末梢区域4、配置完全stub末梢区域5、配置 nssa 非纯末梢区域6、配置完全nssa非纯末梢区域7、配置两种协议相互注入重分发8、实现全网互通一、配置OSPF多区域二、配置rip v2三、…

[AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展

[AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展 健康模型扩展 第一部分已经介绍了AlwayOn健康模型的概述。现在是创建一个自己的PBM策略&#xff0c;然后设置为制定的归类。创建这些策略&#xff0c;创建之后修改一下配置&#xff0c;dashboard就会自动评估这些策略…

665. Non-decreasing Array - LeetCode

Question 665. Non-decreasing Array Solution 题目大意&#xff1a; 思路&#xff1a;当前判断2的时候可以将当前元素2变为4&#xff0c;也可以将上一个元素4变为2&#xff0c;再判断两变化后是否满足要求。 Java实现&#xff1a; public boolean checkPossibility(int[] nums…

如何制作印章_如何用Photoshop制作个性印章/文字图片

带印章和文字的图片&#xff0c;不仅可以作为个人的标签&#xff0c;更能直接表达照片的意境&#xff0c;让片子与众不同。那么&#xff0c;怎样才能给照片加印章和文字呢&#xff1f;或许方法有很多&#xff0c;甚至有多款App也可以直接做效果。但想要做出精细的效果&#xff…

麒麟810处理器_麒麟810性能实测:对比骁龙845骁龙730,谁更强?

随着荣耀9X、Nova5i Pro一众新机发布&#xff0c;采用7nm工艺制程的全新麒麟810进入了我们的视野。以手机处理器性能划分产品定位向来是最为直接的方法&#xff0c;在搭载麒麟810的荣耀9X将价格下探到1399元后&#xff0c;这枚网友口中“拳打845&#xff0c;脚踢730”的中端神u…

打造全键盘操作的PDF阅读器

其实我只想要一个非常简单的PDF阅读器&#xff0c;不要很花哨的功能&#xff0c;只要能够&#xff1a; 速度够快&#xff0c;不要翻一页等半天&#xff1b;全键盘操作&#xff0c;不想在鼠标和键盘之间来回倒腾&#xff1b;可以改变背景色&#xff0c;深夜的白光好刺眼&#xf…

mysql 导出dmp文件_一文带你了解MySQL主从复制(Master-Slave)

1.复制概述Mysql内建的复制功能是构建大型&#xff0c;高性能应用程序的基础。将Mysql的数据分布到多个系统上去&#xff0c;这种分布的机制&#xff0c;是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上&#xff0c;并重新执行一遍来实现的。复制过程中一个服务器充当…

iOS开发学无止境 - NSFileManager文件操作的十个小功能

&#xff08;配图的小故事还记得嘛&#xff09; NSFileManager是一个单列类&#xff0c;也是一个文件管理器。可以通过NSFileManager创建文件夹、创建文件、写文件、读文件内容等等基本功能。 下面将介绍NSFileManager文件操作的十个小功能。我们在Documents里面进行举例&#…

smokeping自动检测系统

如何的使用smokeping来监控idc机房的网络质量情况&#xff0c;从监控图上的延时与丢包能分辨出你机房的网络是否稳定&#xff0c;是否为多线&#xff0c;是否为BGP机房&#xff0c;到各城市的3个运行商网络各是什么情况&#xff0c;如果出现问题&#xff0c;如果有针对的解决。…

bg感_【0328】BG推文 | 5本我在逃生游戏里养娃娃+岁月缱绻已无你+关于我比女主苏这回事+消失的白月光又回来了等...

大家多多支持原文&#xff01;以下内容多为网络搜集&#xff0c;非商业用途。版权归原作者所有&#xff0c;侵联&#xff01;BG文《我在逃生游戏里养娃娃》作者&#xff1a;鹤舫闲人《岁月缱绻已无你》作者&#xff1a;酒爷《关于我比女主苏这回事》作者&#xff1a;欢何极《消…

微信开发者工具 wxmi修改模版颜色_十款高效好用的在线网页工具,提升你的办公效率...

大家好&#xff0c; 我是阿毛&#xff0c;今天给大家推荐高效办公的10个在线网页工具&#xff0c;可以不用下载安装很多app&#xff0c;也不用在电脑上装很多软件。在线制作精彩视频操作非常简单&#xff0c;选择模板&#xff0c;上传照片然后点击制作等待完成就可以了&#xf…

[转]使用Navicat for Oracle工具连接oracle的

使用Navicat for Oracle工具连接oracle的 这是一款oracle的客户端的图形化管理和开发工具&#xff0c;对于许多的数据库都有支持。之前用过 Navicat for sqlserver,感觉很好用&#xff0c;所以下载了Oracle版的用。上网查看了一下这个工具可以用于任何版本 8i 或以上的 Oracle …

微信小程序基于第三方插件微信同声传译,以及一些问题解决办法

使用之前首先得在微信微信小程序后台添加插件&#xff0c;获取插件的appid 名称 使用时在app.json文件添加插件配置 1 plugins: { 2 WechatSI: { 3 version: 0.1.0, 4 provider: wx069ba97219f66d99 5 } 6 } 其次就是在使用的页面进行调用 在index.js外…

TF卡里删掉文件后内存没变大_内存卡损坏怎么修复?数据恢复方法教程

内存卡损坏怎么修复&#xff1f;内存卡又叫SD卡&#xff0c;是一种很轻便小巧的便携存储装置&#xff0c;往往内置于各种便携媒体设备内部。内存卡本身具有坚固、抗冲击等外部特性和读写快、空间大等内部特性&#xff0c;但是内存卡因为每天都要读写大量数据很容易从内部发生损…

idea 如何隐藏/展示不想看到的文件

隐藏&#xff1a;在 Ignore files and folders中添加想要过滤的文件或文件夹名称 展示隐藏文件&#xff1a; 在过滤列表中删除掉文件或者文件夹就好了 转载于:https://www.cnblogs.com/mengjianzhou/p/6177897.html

Java基础知识:Java实现Map集合二级联动4

comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label new JLabel(); label.setText("省/直辖市"); label.setBounds(155, 30, 66, 18); panel.add(label); final JLabel label_1 new JLabel(); label_1.setText(&quo…

linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集

一、前言数据源是组态软件的核心灵魂&#xff0c;少了数据源&#xff0c;组态就是个花架子没卵用&#xff0c;一般数据源有三种方式获取&#xff0c;串口、网络、数据库&#xff0c;至于数据规则是什么&#xff0c;这个用户自己指定&#xff0c;本设计器全部采用第一个字节作为…

JAVA多线程之Synchronize 关键字原理

image众所周知 Synchronize 关键字是解决并发问题常用解决方案&#xff0c;有以下三种使用方式: 同步普通方法&#xff0c;锁的是当前对象。同步静态方法&#xff0c;锁的是当前 Class 对象。同步块&#xff0c;锁的是 {} 中的对象。实现原理&#xff1a;JVM 是通过进入、退出对…