博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板 - 数学 - 矩阵快速幂
阅读量:5152 次
发布时间:2019-06-13

本文共 4045 字,大约阅读时间需要 13 分钟。

线性递推公式找递推矩阵的方法:

https://blog.csdn.net/synapse7/article/details/18790165

构造方法:规定由递推矩阵A,左乘由项构成的矩阵F,其中矩阵A的第一列为对应系数,左下角为单位矩阵,右下角为零矩阵。

对于递推式的常数C,在矩阵F中增加最后一行C,在A的最右列增加两个1(通常选右上角和左下角)。

对于递推式的C的n次方,在矩阵F中增加最后一行C的n次方,在A的最右列增加两个C(通常选右上角和左下角)。

 

以斐波那契数列为例,这里使用了快速乘进一步防止溢出。

#include
using namespace std;#define ll long long#define MAXN 2ll mod=1000000007;//快速乘 a*b%p 防止乘法溢出llll qmut(ll a,ll b){ ll res=0; while(b){ if(b&1) res=(res+a)%mod; a=(a+a)%mod; b>>=1; } return res;}class Matrix { public: ll m[MAXN][MAXN]; //二维数组存放矩阵 Matrix() { memset(m,0,sizeof(m)); } //对数组的初始化 void init(ll num[MAXN][MAXN]) { for(int i = 0 ; i < MAXN ; i++) { for(int j = 0 ; j < MAXN ; j++) { m[i][j] = num[i][j]; } } } Matrix operator*(Matrix &m1) { int i, j, k; Matrix t; for(i = 0; i < MAXN; i++) { for(j = 0; j < MAXN; j++) { t.m[i][j] = 0; for(k = 0 ; k < MAXN ; k++) t.m[i][j] = (t.m[i][j] + qmut(m[i][k],m1.m[k][j]))%mod; } } return t; } Matrix qpow(ll n) { Matrix t; for(int i = 0 ; i < MAXN ; i++) for(int j = 0 ; j < MAXN ; j++) t.m[i][j] = (i == j); Matrix M=*this; while(n) { if(n & 1) t = t * M; n = n >> 1; M = M * M; } return t; } void show() { for(int i=0; i
>n; if(n<=2){ cout<<1<

 

https://www.luogu.org/problemnew/show/P1939

 

#include
using namespace std;#define ll long long#define MAXN 4ll mod=1000000007;//快速乘 a*b%p 防止乘法溢出llll qmut(ll a,ll b){ ll res=0; while(b){ if(b&1) res=(res+a)%mod; a=(a+a)%mod; b>>=1; } return res;}class Matrix { public: ll m[MAXN][MAXN]; //二维数组存放矩阵 Matrix() { memset(m,0,sizeof(m)); } //对数组的初始化 void init(ll num[MAXN][MAXN]) { for(int i = 0 ; i < MAXN ; i++) { for(int j = 0 ; j < MAXN ; j++) { m[i][j] = num[i][j]; } } } Matrix operator*(Matrix &m1) { int i, j, k; Matrix t; for(i = 0; i < MAXN; i++) { for(j = 0; j < MAXN; j++) { t.m[i][j] = 0; for(k = 0 ; k < MAXN ; k++) t.m[i][j] = (t.m[i][j] + qmut(m[i][k],m1.m[k][j]))%mod; } } return t; } Matrix qpow(ll n) { Matrix t; for(int i = 0 ; i < MAXN ; i++) for(int j = 0 ; j < MAXN ; j++) t.m[i][j] = (i == j); Matrix M=*this; while(n) { if(n & 1) t = t * M; n = n >> 1; M = M * M; } return t; } void show() { for(int i=0; i

 


 

带n的次方的矩阵快速幂,找出相邻两项的关系就可以,用杨辉三角就可以了。

#include
using namespace std;#define ll long long#define MAXN 8ll mod=2147493647;class Matrix { public: ll m[MAXN][MAXN]; //二维数组存放矩阵 Matrix() { memset(m,0,sizeof(m)); } //对数组的初始化 void init(ll num[MAXN][MAXN]) { for(int i = 0 ; i < MAXN ; i++) { for(int j = 0 ; j < MAXN ; j++) { m[i][j] = num[i][j]; } } } Matrix operator*(Matrix &m1) { int i, j, k; Matrix t; for(i = 0; i < MAXN; i++) { for(j = 0; j < MAXN; j++) { t.m[i][j] = 0; for(k = 0 ; k < MAXN ; k++) t.m[i][j] = (t.m[i][j] + m[i][k]*m1.m[k][j]%mod)%mod; } } return t; } Matrix qpow(ll n) { Matrix t; for(int i = 0 ; i < MAXN ; i++) for(int j = 0 ; j < MAXN ; j++) t.m[i][j] = (i == j); Matrix M=*this; while(n) { if(n & 1) t = t * M; n = n >> 1; M = M * M; } return t; } void show() { for(int i=0; i

 

转载于:https://www.cnblogs.com/Yinku/p/10398954.html

你可能感兴趣的文章
Linux下安装maven
查看>>
使用OpenMP实现并行归并排序(Report)
查看>>
转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量...
查看>>
linux nohup【转】
查看>>
SQL语句优化
查看>>
校验银行卡号是否符合Luhn算法及生成符合Luhn算法的银行卡号
查看>>
MFC 双缓冲加载背景
查看>>
记录自己最近的学习状态
查看>>
hdu 1142 最短路+记忆化深搜---好题
查看>>
day 018 面向对象--约束和异常处理
查看>>
Day3_基本数据类型
查看>>
Fire Maze(广度优先搜索)
查看>>
Linux Kernel API
查看>>
oracle学习
查看>>
【C语言项目】贪吃蛇游戏(下)
查看>>
DevExpress第三方控件汉化的全部代码和使用方法
查看>>
二分查找算法(C#实现)
查看>>
vue项目中开启Eslint碰到的一些问题及其规范
查看>>
ES terms多值搜索及范围过滤深入剖析-搜索系统线上实战
查看>>
大咖专栏 | DevOps组织如何有效地实施MSA
查看>>