快速幂、矩阵快速幂、快速乘法
快速幂
快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算。我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用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
快速幂、矩阵快速幂、快速乘法相关推荐
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...
- 快速幂+矩阵快速幂(总结+例题)
1.快速幂 以求a的b次方来介绍: 首先把b转换成二进制数 该二进制数第i位的权为 2^i - 1 . 比如 : 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 ...
- 快速幂+矩阵优化斐波那契数列(超详细教程)
文章目录 前言 一.快速幂 二.矩阵优化斐波那契数列 1.矩阵相关知识 2.斐波那契数列用矩阵表示 3.O(log2n)的斐波那契数列 三.全部实现代码 前言 我们首先讲解快速幂,然后利用快速幂优化矩 ...
- 快速幂+矩阵快速幂模板
快速..运算 快速幂 运用位运算 代码 分析 矩阵快速幂 题目 分析 代码 拓一..: 快速幂 运用位运算 强大的位运算把我搞得蒙蒙的 理解了之后我表示很喜欢!!! 代码 int power(int ...
- 40行代码AC_HDU 1575 TrA 矩阵快速幂(附快速幂+矩阵快速幂的讲解)
一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 心路历程 1.开始看成求主对角线元素和的n次幂了,用快速幂解得.结果压根不对,又仔细看 ...
- fps透视基础-3分钟快速定位矩阵基址-附3D坐标转屏幕坐标算法
目录 矩阵介绍 根据矩阵特征快速定位矩阵头基址[以csgo游戏为例] 函数封装
- 4.9-4.10 矩阵乘法的性质 矩阵的幂运算 矩阵的转置及其性质
矩阵乘法的性质 矩阵的乘法不遵守交换律 ! 矩阵乘法遵守结合律.分配律 对于任意r行c列的矩阵A,存在c行x列的矩阵O,满足:A . Ocx = Orx 对于任意r行c列的矩阵A,存在x行r列的矩阵O ...
- Matlab快速创建矩阵的方法(创建特殊矩阵)
在matlab的使用过程中经常会需要用到矩阵,有时想要创建一些数据比较多的矩阵,对矩阵的内容要求可能并不高或者要创建一些特殊矩阵,下面将提供一些matlab内部提供的一些快速创建矩阵的方法. 1 创建 ...
- 【如何快速判断矩阵是否相似对角化】
快速判断矩阵是否可以相似对角化 关于如何快速判断矩阵是否可以相似对角化的方法 `第一步:看是不是实对称矩阵,如果是实对称矩阵,立即推可相似对角化,如果不是实对称矩阵,看第二步''第二步,求方阵的n个特 ...
- 矩阵的幂运算--蓝桥杯
试题 基础练习 矩阵乘法 题目 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 1 ...
最新文章
- DMB DSB ISB 简介
- Github 最新 AI 开源项目了解一下?
- SAP Spartacus Unit List树形数据的加载触发时机
- python argparse模块详解_python中argparse模块用法实例详解
- 不连续曲线 highcharts_无人车运动规划中常用的方法:多项式曲线
- CentOS7安装Hadoop2.7完整步骤
- 今晚直播丨EsgynDB SQL优化专题
- element ui el-carousel 滚动图 vue 基于vue-lazyload图片懒加载、延迟加载 解决方案
- java graphics旋转_Java图像之自定义角度旋转(实例)
- 安装自带python3.6的Anaconda3,并安装tensorflow,导入Pycharm中使用
- [论文总结] 智慧农业论文摘要阅读概览
- 每周公布病情 - 北京18区县均有手足口病例
- win10安装wget
- 爬虫实战:遇上gb2312编码的网页
- 数字化浪潮下 哪些银行业务或“生变”
- django+javascrpt+python实现私有云盘代码
- No executable file specified.Use the “file“ or “exec-file“ command.
- [名词解释] PATA和SATA I
- MATLAB--数字图像处理 图像噪声与滤波处理
- fastadmin多级联动