矩阵快速幂其实是一个用于加速计算的一个算法。

矩阵快速幂和我们普通的数的快速幂是没有啥太大的区别的。不过一个是数,一个是矩阵。
矩阵快速幂的应用: 矩阵加速递推。例如:如果有一道题目让你求斐波那契数列第n项的值,最简单的方法莫过于直接递推了。但是如果n的范围达到了 1018级别,递推就不行了,稳 TLE。考虑矩阵加速递推。

看一个模板题来了解矩阵快速幂:

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int mod=1e9+7;
typedef long long int LL;
LL n,m;
struct node{LL a[N][N];}a,ans;
node mul(node a,node b,int p)
{node sum={0};for(int i=1;i<=n;i++)for(int k=1;k<=n;k++)for(int j=1;j<=n;j++)sum.a[i][j]=(sum.a[i][j]+a.a[i][k]*b.a[k][j])%p;return sum;
}
node  qsm(node a,LL b,LL p)
{node sum={0};for(int i=1;i<=n;i++) sum.a[i][i]=1;//单元矩阵while(b) {if(b&1) sum=mul(sum,a,mod);b>>=1;a=mul(a,a,mod);}return sum;
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) cin>>a.a[i][j];ans=qsm(a,m,mod);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cout<<ans.a[i][j]<<' ';cout<<'\n';}return 0;
}

矩阵快速幂的实际应用 。例题:

如果单纯的递推的话一定会T,故考虑矩阵快速幂来优化。
使用矩阵快速幂来优化,最重要的一步便是,构造常系数矩阵。
我们要将递推的运算转化成矩阵来运算。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=15;
const int mod=10000;
struct node{LL a[N][N];}ans,a;
int f[15]={0,1};
node mul1(node a,node b,LL p)
{node c={0};for(int i=1;i<=1;i++)for(int k=1;k<=2;k++)for(int j=1;j<=2;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;return c;
}
node mul2(node a,node b,LL p)
{node c={0};for(int i=1;i<=2;i++)for(int k=1;k<=2;k++)for(int j=1;j<=2;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;return c;
}
node qsm(node a,LL b,LL p)
{node sum={0}; sum.a[1][1]=1,sum.a[1][2]=1;while(b){if(b&1) sum=mul1(sum,a,p);b>>=1;a=mul2(a,a,p);}return sum;
}
int main(void)
{LL n;while(cin>>n,n!=-1){a.a[1][1]=1,a.a[1][2]=1;a.a[2][1]=1,a.a[2][2]=0;if(n<=2) cout<<f[n]<<'\n';else{ans=qsm(a,n-2,mod);cout<<ans.a[1][1]<<'\n';}}return 0;
}

例题二:


故求斐波那契的第n项和第n+1项求一个乘积即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=15;
const int mod=1e9+7;
struct node{LL a[N][N];}a,ans;
int f[15]={0,1};
node mul1(node a,node b,LL p)
{node c={0};for(int i=1;i<=1;i++)for(int k=1;k<=2;k++)for(int j=1;j<=2;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;return c;
}
node mul2(node a,node b,LL p)
{node c={0};for(int i=1;i<=2;i++)for(int k=1;k<=2;k++)for(int j=1;j<=2;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%p;return c;
}
node qsm(node a,LL b,LL p)
{node sum={0}; sum.a[1][1]=1,sum.a[1][2]=1;while(b){if(b&1) sum=mul1(sum,a,p);b>>=1;a=mul2(a,a,p);}return sum;
}
int main(void)
{LL n; cin>>n;a.a[1][1]=1,a.a[1][2]=1;a.a[2][1]=1,a.a[2][2]=0;if(n==1) puts("1");else{ans=qsm(a,n-1,mod);cout<<(ans.a[1][1]*ans.a[1][2])%mod<<'\n';}return 0;
}

例题三:

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=15;
const int mod=1e9+7;
struct node{LL a[N][N];}ans,a;
int t;
node mul1(node a,node b,LL mod)
{node c={0};for(int i=1;i<=1;i++)for(int k=1;k<=3;k++) for(int j=1;j<=3;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;return c;
}
node mul2(node a,node b,LL mod)
{node c={0};for(int i=1;i<=3;i++)for(int k=1;k<=3;k++) for(int j=1;j<=3;j++)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;return c;
}
node qsm(node a,LL b,LL p)
{node sum={0};sum.a[1][1]=1,sum.a[1][2]=1,sum.a[1][3]=1;while(b) {if(b&1) sum=mul1(sum,a,mod);b>>=1;a=mul2(a,a,p);}return sum;
}
int main(void)
{cin>>t;while(t--){LL n; cin>>n;if(n<=3) cout<<1<<'\n';else{a.a[1][1]=1,a.a[1][2]=1,a.a[1][3]=0;a.a[2][1]=0,a.a[2][2]=0,a.a[2][3]=1;a.a[3][1]=1,a.a[3][2]=0,a.a[3][3]=0;ans=qsm(a,n-3,mod);cout<<ans.a[1][1]<<'\n';}}return 0;
}

ACM入门之【矩阵快速幂】相关推荐

  1. ACM数论之矩阵快速幂

    题目链接:杭电1005.一个简单的矩阵快速幂,一开始一直不理解,只是会单纯数字的快速幂,后来经人点拨,只是运算单位不同,一个是矩阵一个是数字.普通数字中的快速幂是用1来作为累乘量的,而矩阵中的单位矩阵 ...

  2. ACM入门之【快速幂】

    快速幂模板 typedef long long int LL; LL quick_mi(LL a,LL b,LL p) {LL sum=1;while(b){if(b&1) sum=sum*a ...

  3. 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15

    今天凌晨3点才睡,没想到通过看小说抑制玩游戏,反而看小说的时间更长. u1s1:那小说太刺激了,晚上看很有感觉,风吹草动我就会猛地看过去(类似茄子说柜子动了,哈哈),真TM(语气词)练胆量!!!..Q ...

  4. 又见斐波那契~矩阵快速幂入门题

    链接:https://www.nowcoder.com/acm/contest/105/G 来源:牛客网 题目描述 这是一个加强版的斐波那契数列. 给定递推式 求F(n)的值,由于这个值可能太大,请对 ...

  5. POJ 3070 Fibonacci(矩阵快速幂入门、模板)

    ? 题目链接:http://poj.org/problem?id=3070 ?   这题就是让求斐波那契数列的第n项,但是题目中n很大,所以打表和直接求都会TLE,对于这个题我们可以用矩阵快速幂,下面 ...

  6. 湖南大学第十四届ACM程序设计新生杯(重现赛)L-The Digits String (矩阵快速幂)

    题目链接 题目描述 Consider digits strings with length n, how many different strings have the sum of digits a ...

  7. 2017网易笔试矩阵快速幂

    昨天网易笔试,竟然除了矩阵快速幂的题目,日了狗了,离开acm好久了,忘得差不多了,囫囵吞枣补一下吧,哎,太菜了! 题目如下 小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使 ...

  8. HDU 6185 Covering 矩阵快速幂 递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...

  9. hdu 5451 Best Solver 矩阵循环群+矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x    求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...

  10. 一文彻底搞懂快速幂(原理、实现、矩阵快速幂)

    前言 大家好,我是bigsai,之前有个小老弟问到一个剑指offer一道相关快速幂的题,这里梳理一下讲一下快速幂! 快速幂是什么? 顾名思义,快速幂就是快速算底数的n次幂.你可能疑问,求n次幂算n次叠 ...

最新文章

  1. 从技术到科学,中国AI向何处去?
  2. 皮一皮:这个老爸有觉悟...
  3. JavaScript知识总结
  4. android ota 版本校验,OTA升级签名校验简析
  5. Web 端的下一代三维图形
  6. Python词云 wordcloud 十五分钟入门与进阶
  7. 浅谈《刺客信条》的叙事:刺客和圣殿骑士的冲突与融合
  8. oracle中取反_oracle正则表达式regexp_like的用法详解
  9. 微课|中学生可以这样学Python(例9.1):Excel导入SQLite(1)
  10. Spider引擎分布式数据库解决方案(最全的spider教程)
  11. python3 ftplib_python3从零学习-5.10.9、ftplib—FTP 协议客户端
  12. 线性同余法生成随机数
  13. C语言用0832输出正弦波,[求助]关于使用DAC0832输出正弦波的汇编算法【恢复】
  14. 淘宝买卖交流爆笑全集
  15. 费氏数列 中第n项数值的计算并打印
  16. 聪明人为何无法征服世界?
  17. cdrom是什么意思_电脑按f8一键出现cdrom:ps-ASUS DVD-e818a4是什么意思
  18. 开环零极点对根轨迹的影响
  19. TI官方代码中的任务状态机
  20. 软件测试全网最全复习总结-别杠,杠就是你对

热门文章

  1. 使用java实现MD5码算法
  2. keytool基本使用
  3. 通过身份证地址或家庭地址获取行政区划代码
  4. 干货:大米云LAMP使用说明
  5. iPad2如何从iOS6降级到5.1.1
  6. web显示实时时间动态刷新
  7. Vivo手机originOS安装谷歌套件服务框架GMS安装谷歌三件套,进Google Play商店下载应用
  8. u盘和计算机捆绑,不要再使用乱七八糟的捆绑PE了——教你制作最纯净的PE系统维护U盘!...
  9. 华为服务器修改SN,华为光猫修改双模、SN序号、MAC地址方法
  10. SDR软件无线电知识要点(一)噪声系数与噪声因子