快速幂

快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算。我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用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

快速幂、矩阵快速幂、快速乘法相关推荐

  1. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

    题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...

  2. 快速幂+矩阵快速幂(总结+例题)

    1.快速幂 以求a的b次方来介绍: 首先把b转换成二进制数 该二进制数第i位的权为  2^i - 1 . 比如 : 11的二进制是1011 11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 ...

  3. 快速幂+矩阵优化斐波那契数列(超详细教程)

    文章目录 前言 一.快速幂 二.矩阵优化斐波那契数列 1.矩阵相关知识 2.斐波那契数列用矩阵表示 3.O(log2n)的斐波那契数列 三.全部实现代码 前言 我们首先讲解快速幂,然后利用快速幂优化矩 ...

  4. 快速幂+矩阵快速幂模板

    快速..运算 快速幂 运用位运算 代码 分析 矩阵快速幂 题目 分析 代码 拓一..: 快速幂 运用位运算 强大的位运算把我搞得蒙蒙的 理解了之后我表示很喜欢!!! 代码 int power(int ...

  5. 40行代码AC_HDU 1575 TrA 矩阵快速幂(附快速幂+矩阵快速幂的讲解)

    一道经典的矩阵快速幂模板题. 传送门1-->快速幂基本思想 传送门2-->矩阵快速幂讲解(教主传授) 心路历程 1.开始看成求主对角线元素和的n次幂了,用快速幂解得.结果压根不对,又仔细看 ...

  6. fps透视基础-3分钟快速定位矩阵基址-附3D坐标转屏幕坐标算法

    目录 矩阵介绍 根据矩阵特征快速定位矩阵头基址[以csgo游戏为例] 函数封装

  7. 4.9-4.10 矩阵乘法的性质 矩阵的幂运算 矩阵的转置及其性质

    矩阵乘法的性质 矩阵的乘法不遵守交换律 ! 矩阵乘法遵守结合律.分配律 对于任意r行c列的矩阵A,存在c行x列的矩阵O,满足:A . Ocx = Orx 对于任意r行c列的矩阵A,存在x行r列的矩阵O ...

  8. Matlab快速创建矩阵的方法(创建特殊矩阵)

    在matlab的使用过程中经常会需要用到矩阵,有时想要创建一些数据比较多的矩阵,对矩阵的内容要求可能并不高或者要创建一些特殊矩阵,下面将提供一些matlab内部提供的一些快速创建矩阵的方法. 1 创建 ...

  9. 【如何快速判断矩阵是否相似对角化】

    快速判断矩阵是否可以相似对角化 关于如何快速判断矩阵是否可以相似对角化的方法 `第一步:看是不是实对称矩阵,如果是实对称矩阵,立即推可相似对角化,如果不是实对称矩阵,看第二步''第二步,求方阵的n个特 ...

  10. 矩阵的幂运算--蓝桥杯

    试题 基础练习 矩阵乘法 题目 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 1 ...

最新文章

  1. DMB DSB ISB 简介
  2. Github 最新 AI 开源项目了解一下?
  3. SAP Spartacus Unit List树形数据的加载触发时机
  4. python argparse模块详解_python中argparse模块用法实例详解
  5. 不连续曲线 highcharts_无人车运动规划中常用的方法:多项式曲线
  6. CentOS7安装Hadoop2.7完整步骤
  7. 今晚直播丨EsgynDB SQL优化专题
  8. element ui el-carousel 滚动图 vue 基于vue-lazyload图片懒加载、延迟加载 解决方案
  9. java graphics旋转_Java图像之自定义角度旋转(实例)
  10. 安装自带python3.6的Anaconda3,并安装tensorflow,导入Pycharm中使用
  11. [论文总结] 智慧农业论文摘要阅读概览
  12. 每周公布病情 - 北京18区县均有手足口病例
  13. win10安装wget
  14. 爬虫实战:遇上gb2312编码的网页
  15. 数字化浪潮下 哪些银行业务或“生变”
  16. django+javascrpt+python实现私有云盘代码
  17. No executable file specified.Use the “file“ or “exec-file“ command.
  18. [名词解释] PATA和SATA I
  19. MATLAB--数字图像处理 图像噪声与滤波处理
  20. fastadmin多级联动

热门文章

  1. 个人工作总结04(冲刺二)
  2. ios7 苹果原生二维码扫描(和微信类似)
  3. android log显示
  4. 基于 Spring Cloud 完整的微服务架构实战
  5. 常见算法及问题场景——图
  6. 为数据计算提供强力引擎,阿里云文件存储HDFS v1.0公测发布
  7. koa2 中使用 svg-captcha 生成验证码
  8. Item 14 In public classes, use accessor methods, not public fields
  9. 【转载】C# 理解泛型
  10. win2008修改远程端口