http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113

矩阵快速幂:首先前置技能:  快速幂 + 矩阵乘法。

1  快速幂

1.1 快速乘法

题目:http://newoj.acmclub.cn/problems/2088

1.1.1

引用自2009年国家集训队论文,骆可强:《论程序底层优化的一些方法与技巧》 (膜膜膜)

可以根据需要换成uLL   (unsigned long long)

// O(1)#include <stdio.h>
typedef long long LL;
inline LL mult_mod(LL a, LL b, LL m){ // a * b % ma = (a % m + m) % m;b = (b % m + m) % m;LL ans = a * b - (LL)((long double) a * b / m + 0.5) * m;return ans < 0? ans + m : ans;
}int main(){LL x, y, m;while(~scanf("%lld%lld%lld", &x, &y, &m)){printf("%lld\n", mult_mod(x, y, m));}return 0;
}

1.1.2  O(log b)

原理:

 由于计算机底层设计的原因,做加法往往比乘法快的多,因此将乘法转换为加法计算将会大大提高(大数,比较小的数也没必要)乘法运算的速度,除此之外,当我们计算a*b%mod的时候,往往较大的数计算a*b会超出long long int的范围,这个时候使用快速乘法方法也能解决上述问题. 
  快速乘法的原理就是利用乘法分配率来将a*b转化为多个式子相加的形式求解(注意这时使用乘法分配率的时候后面的一个乘数转化为二进制的形式计算).举个栗子 
  20*14 = 20*(1110)2 = 20*(2^3)*1 + 20*(2^2)*1+20*(2^1)*1+20*(2^0)*0 = 160+80+40=280. 
  这样计算了4次 而直接算的话 需要14次计算哦

typedef long long LL;
LL multi(LL a, LL b, LL m){// a * b % mLL ret = 0;while(b > 0){if(b & 1){ret = (ret + a) % m;}b >>= 1;a = (a << 1) % m;}return ret;
}

关于用哪个 emmm 大家自己决定吧, 一般都是用log b那个

1.2  快速幂

其实快速幂的思想和log那个快速乘的思想差不多 也是将b转为二进制  不多赘述了

丢上百度链接 : https://baike.baidu.com/item/快速幂/5500243?fr=aladdin

用到快速乘是因为 当a 和 b 太大的时候 用快速乘优化

#include <stdio.h>
typedef long long LL;
LL multi(LL a, LL b, LL m){// a * b % mLL ret = 0;while(b > 0){if(b & 1){ret = (ret + a) % m;}b >>= 1;a = (a << 1) % m;}return ret;
}LL quick_mod(LL a, LL b, LL m){LL ans = 1;while(b){if(b & 1){ans = multi(ans,a,m);b--;}b /= 2;a = multi(a, a, m);}return ans;
}

2 矩阵乘法

2.1矩阵乘法

矩阵属于线性代数的东西。 受教于MR.ZZZ, 嘤嘤嘤 赵哥教了我好多东西。qaq

2.1.1 矩阵

由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:

2.1.2 矩阵乘法

前提: 矩阵A 乘 矩阵B  可以想乘的前提是 A的列数 == B的行数

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义

矩阵A (m * a)  * 矩阵B(a * n) = 矩阵C(m * n)

矩阵乘法如何用代码实现呢?

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1137

#include <stdio.h>
const int maxn = 1000 + 10;
int a[maxn][maxn], b[maxn][maxn];
long long c[maxn][maxn];
int main(){int n;scanf("%d", &n);for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){scanf("%d", &a[i][j]);}}for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){scanf("%d", &b[i][j]);}}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){for(int k = 1; k <= n; k++){c[i][j] += a[i][k] * b[k][j];}if(j == n){printf("%lld\n", c[i][j]);}else{printf("%lld ", c[i][j]);}}}return 0;
}

2.2 单位矩阵

在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。

单位矩阵的乘法: 矩阵A * 单位矩阵 = 矩阵A

3 矩阵快速幂

3.1 有了前两个前置技能后, 那么矩阵快速幂就很好理解了。 我们可以把矩阵看作一个特殊的数字,然后去用快速幂的思想去写,最开始的ans为单位矩阵(单位矩阵的特性)。我们重写一下乘法就好了,具体看代码吧。

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113

//
//  1113 - 矩阵快速幂.cpp
//  数论
//
//  Created by Terry on 2018/9/27.
//  Copyright © 2018年 Terry. All rights reserved.
//
//  1: 单位矩阵 * 矩阵A = 矩阵A
//  2: 矩阵快速幂 可以对应 快速幂去理解 就是重写一下乘法  a
//      把快速幂里面的数字乘法 重写成 矩阵乘法
#include <stdio.h>
int read(){int x = 0, f = 1;char ch=getchar();while(ch < '0' || ch > '9'){if(ch=='-') f = -1; ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}return x * f;
}
typedef long long LL;
const int mod = 1e9 + 7;
const int maxn = 100 + 10;
struct Matrix{int m[maxn][maxn];
}unit;
int n;
Matrix operator * (Matrix a, Matrix b){Matrix ret;LL x;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){x = 0;for(int k = 0; k < n; ++k){x += ((LL)a.m[i][k] * b.m[k][j]) % mod;}ret.m[i][j] = x % mod;}}return ret;
}
void init_unit(){// 单位矩阵for(int i  = 0; i < maxn; i++){unit.m[i][i] = 1;}
}
Matrix pow_mat(Matrix a, LL n){Matrix ans = unit;while (n) {if(n & 1){ans = ans * a;}a = a * a;n >>= 1;}return ans;
}
int main(){init_unit();n = read();LL x = read();Matrix a;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){a.m[i][j] = read();}}a = pow_mat(a, x);for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){if(j == n - 1){printf("%d\n", a.m[i][j]);}else{printf("%d ", a.m[i][j]);}}}return 0;
}

51nod 1133 - 矩阵快速幂(模版) 快速乘 + 快速幂 + 矩阵快速幂相关推荐

  1. Delphi下实现全屏快速找图找色 二、矩阵遍历

    二.矩阵遍历 矩阵遍历是一个数据结构方面的问题.假设有一个矩阵Matrix,它共有RowCount行,每行有ColCount列,当利用y表示行数,x表示列数,那么利用Matrix[y,x]就可以访问矩 ...

  2. 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程

    本发明属于信号处理领域,尤其涉及一种基于快速谱峭度分析泵的实时状态并且检测其潜在空化故障的方法. 背景技术: 高性能离心泵在当今社会上广泛应用和需求巨大.由于工作在高压高速等复杂条件下,离心泵的空化故 ...

  3. 3.2 实战项目二(手工分析错误、错误标签及其修正、快速地构建一个简单的系统(快速原型模型)、训练集与验证集-来源不一致的情况(异源问题)、迁移学习、多任务学习、端到端学习)

    手工分析错误 手工分析错误的大多数是什么 猫猫识别,准确率90%,想提升,就继续猛加材料,猛调优?     --应该先做错误分析,再调优! 把识别出错的100张拿出来, 如果发现50%是"把 ...

  4. 快速生成树算法java_生成树RSTP,快速生成树协议,交换网络必用的破环协议,面试必备...

    一.RSTP 802.1w 标准定义了快速生成树协议 RSTP(Rapid Spanning Tree Protocol),该协议基于 STP 协议,对原有的 STP 协议进行了改进并实现了快速收敛. ...

  5. 51Nod --1133 不重叠的线段

    51Nod --1133 不重叠的线段 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以 ...

  6. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

  7. 如何快速传输大文件,介绍大文件快速方法

    现在,企业比以往任何时候都面临着一个重大挑战:需要一个快速共享文件的解决方案.但是,并非所有快速文件传输解决方案都以相同的速度传输文件.文件大小.端点位置.路径.设备.防火墙.网络系统和加密需求都会限 ...

  8. C4D整理工程技巧经验,C4D快速把对象放到最顶部,C4D快速找到对象位置。

    问题: C4D整理工程技巧经验,C4D快速把对象放到最顶部,C4D快速找到对象位置. 答案: 在对象窗口和视图窗口按s键可以快速定位对象的位置. 这个大部分人都已经知道了,还有个小技巧就是 选中某个对 ...

  9. c语言快速入门ppt,[计算机软件及应用]C语言快速入门.ppt

    [计算机软件及应用]C语言快速入门.ppt 第2章 C语言快速入门,程序设计语言C,本章学习内容,标识符命名: 数据类型.变量和常量: 常用运算符和表达式: 基本输入输出: 过程控制结构(顺序.选择. ...

  10. 计算机快速访问工作栏在哪,excel快速访问工具栏 将计算器添加到Excel快速访问工具栏的方法...

    excel快速访问工具栏 将计算器添加到Excel快速访问工具栏的方法,看到标题你是不是很兴奋,这不就是你想学习的知识吗?当你掌握excel快速访问工具栏这个知识的时候你一定很兴奋,一定不会后悔看了e ...

最新文章

  1. SQL Server 2012 Express LocalDB
  2. SQL Server中常用的快捷键
  3. 实验9 结构程序设计 7-4 查找书籍
  4. sql2005新增排序方法
  5. 激光炸弹(BZOJ1218)
  6. java if (name!=null name!=),java中的NullPointerException异常
  7. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】
  8. 说一下朗数可视化快速开发平台
  9. Redis基本操作练习
  10. 【uniapp公众号分销商城从0到1】手机验证注册登录(04)
  11. 步道乐跑 位置模拟刷步数
  12. 微信公众号的订阅号和服务号权限区别
  13. 如何通过Spring的ApplicationListener事件注册服务
  14. 腾讯云服务器手动建立WordPress个人站点Windows系统教程-Unirech腾讯云国际版代充
  15. 110道 Elasticsearch面试题及答案(持续更新)
  16. 数据结构二叉树之Huffman编码
  17. 自然场景文本检测识别技术综述【转】
  18. JAVA实现negotiate认证_Java SSO windows AD spring4 – Negotiate Header无效:
  19. 多元线性回归结果怎么看?
  20. 歌谣学前端之react笔记之学习日历样式的设置

热门文章

  1. 行人检测资源(上)综述文献
  2. 记录一次APP的转让流程
  3. ng-show和ng-if的区别和使用场景
  4. RQNOJ 342 最不听话的机器人:网格dp
  5. android dialog转layout
  6. 让Node.js在Azure上运行-3
  7. 优化-SQL Server 05 的动态管理视图DMV和函数DMF
  8. 中科大软件学院第一学期总结
  9. scala基础-04
  10. openssl代码领读目录