线性代数 —— 矩阵快速幂
【概述】
矩阵快速幂利用矩阵的乘法与整数快速幂的结合,能够快速的算出 n 阶方阵 A 的 M 次幂 A^b,其结果仍是一个矩阵,无具体含义,在信息学竞赛中,矩阵快速幂常用于求解线性递推关系。
关于矩阵的基础知识:点击这里
关于线性递推关系:点击这里
【n*m 矩阵的快速幂】
struct Matrix{LL s[N][N];
};
Matrix e;//单位矩阵E
Matrix x;//构造矩阵
void init(int n){for(int i=1;i<=n;i++)//主对角线为1e.s[i][i]=1;
}
Matrix mul(Matrix A,Matrix B,LL n){//矩阵乘法,n代表A、B两个矩阵是n阶方阵Matrix temp;//临时矩阵,存放A*B结果for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)temp.s[i][j]=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)temp.s[i][j]=((temp.s[i][j]+A.s[i][k]*B.s[k][j])%MOD+MOD)%MOD;return temp;
}
Matrix quickPower(Matrix a,LL b,LL n){//矩阵快速幂,求n阶矩阵a的b次幂Matrix ans=e;while(b){if(b&1)ans=mul(ans,a,n);//ans=e*aa=mul(a,a,n);//a=a*ab>>=1;}return ans;
}
int main(){LL n,m; //构造矩阵的大小、阶scanf("%lld%lld",&n,&m);init(n);//单位矩阵初始化for(int i=1;i<=n;i++)//输入构造矩阵,也可通过题目的递推公式来构造矩阵for(int j=1;j<=n;j++)cin>>x.s[i][j];Matrix res=quickPower(x,m,n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%lld ",res.s[i][j]);printf("\n");}return 0;
}
【1*n 矩阵的快速幂】
struct Matrix{LL s[N];//1*n的矩阵
};
Matrix e;//单位矩阵E
Matrix x;//构造矩阵x
void init(int n){//单位矩阵的第一行for(int i=1;i<=n;i++)e.s[i]=0;e.s[1]=1;
}
Matrix mul(Matrix A,Matrix B,LL n){//矩阵乘法Matrix temp;//临时矩阵,存放矩阵A*矩阵B的结果for(int i=1;i<=n;i++)temp.s[i]=0;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)temp.s[i]=(temp.s[i]+(A.s[j]*B.s[i-j+1])%MOD)%MOD;return temp;
}
Matrix quickPower(Matrix A,LL k,LL n){//矩阵快速幂Matrix res=e;while(k){if(k&1)res=mul(A,res,n);//res=A*eA=mul(A,A,n);//A=A*Ak>>=1;}return res;
}
int main(){LL n,k;scanf("%lld%lld",&n,&k);init(n);for(int i=1;i<=n;i++)//构造矩阵初始值,根据题目要求推导x.s[i]=1;Matrix res=quickPower(x,k,n);//k次幂for(int i=1;i<=n;i++)printf("%d ",res.s[i]);printf("\n");return 0;
}
【矩阵 1~k 次幂的和】
原理:二分求和
- 当 n 是奇数时:
- 当 n 是偶数时:
struct Matrix{LL s[N][N];
};
Matrix add(Matrix A,Matrix B){//A+BMatrix temp;for(int i=0;i<n;i++)for(int j=0;j<n;j++)temp.s[i][j]=(A.s[i][j]+B.s[i][j])%mod;return temp;
}
Matrix sum(Matrix A,int k){//A+A^2+A^3+…+A^kif(k==1)return A;if(k%2){Matrix temp=sum(A,k-1);Matrix pow=quickPow(A,k);return add(temp,pow);}else {Matrix temp=sum(A,k>>1);Matrix pow=add(quickPow(A,k>>1),E);return mul(temp,pow);}
}
【经典问题:共轭矩阵的构造】
1.问题
对于给出的 a、b、m、n,当满足 时,求:
2.思路
设 ,配项 ,并令
由于 An、Bn 恰好共轭,因此 An、Bn 的和与积均为有理数
根据 ,可知 Bn<1
因此 ,那么
故而可根据 Cn 来构造共轭矩阵,进行矩阵快速幂来求 Sn
3.共轭式的构造
根据 构造共轭矩阵
对 Cn 两端同乘 ,有:
进行化简:
写成矩阵形式:
再递推一步:
其中,
然后根据构造的矩阵进行矩阵快速幂计算结果即可
【例题】
- Fast Matrix Calculation(HDU-4965)(矩阵化简):点击这里
- So Easy!(HDU - 4565)(共轭矩阵的构造):点击这里
- Partial Sums(CF-223B)(1*n 的矩阵快速幂):点击这里
线性代数 —— 矩阵快速幂相关推荐
- POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:点击查看 题目大意:给出 n 个长度不大于 10 的字符串表示病毒串,再给出一个长度 len ,问长度为 len 的字符串中,有多少个字符串不含有病毒串作为子串 题目分析:因为病毒串的长度和 ...
- 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)
学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第一行第一列的元素.(详解参见线性代数) ...
- mysql 矩阵运算_MySQL实现算法:矩阵快速幂
前几日在地铁上和好友讨论起MySQL数据库,由于MySQL数据库不支持复合类型变量,就想到能否用MySQL去实现一些算法呢.最近在学习MySql存储程序,昨天闲来无事,就动手写写吧,借此巩固一下存储过 ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
- 快速幂 + 矩阵快速幂
快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...
- HDU4549(矩阵快速幂+快速幂)
f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...
- [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]
解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...
- I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...
最新文章
- 机器学习算法面试—口述(4):决策树
- Redux中的重要概念
- c++ stl stack_C ++ STL中的stack :: push()函数
- 《深入理解Android:卷III A》一一第3章 深入理解AudioService
- mycat php pdo,mycat程序写入和读取中文乱码解决
- python的字符串类型_python如何判断某变量是否为字符串类型
- 集成电路CAD习题及答案
- AndroidStudio中的NDK开发初探
- win7电脑怎样修改环境变量
- 全球及中国钢铁贸易行业销售模式与供给规模预测报告2021版
- ubuntu在终端会话和图形界面之间切换的快捷键
- Kafka学习笔记1
- 十七 SQL ALTER 与 AUTO INCREMENT
- 【论文极速看】ERNIE-VIL 一种基于场景图解析的多模态表征方法
- 记一次个人服务器被nicehash挖矿,排查挖矿程序记录
- 证券基础--股票发行上市
- 什么是JSON。如何使用JSON。
- 舆情监测系统适用哪些行业,如何选择舆情监测系统?
- 音创a55linux歌库管理,ktv点歌系统加歌-音创KTV点歌系统怎么增加歌曲进歌库?音创 – 手机爱问...
- 3DMAX部分快捷键