矩阵快速幂 【模板】
2015-08-30 20:11
369 查看
问题:求解一个N*N矩阵的 M次幂。
核心:构造矩阵。
思想:利用二进制优化时间复杂度。
应用:优化递归公式!!!
举例:求解第N个斐波那契数。
代码实现:
输入:
输出:
核心:构造矩阵。
思想:利用二进制优化时间复杂度。
应用:优化递归公式!!!
举例:求解第N个斐波那契数。
代码实现:
#include <cstdio> #include <cstring> #include <algorithm> #define MAXN 100 #define LL long long #define MOD 10000 using namespace std; struct Matrix { LL a[MAXN][MAXN]; int r, c;//行数 列数 }; Matrix ori, res;//初始矩阵 和 结果矩阵 void init(int n)//初始化矩阵 { memset(res.a, 0, sizeof(res.a)); res.r = res.c = n; for(int i = 1; i <= n; i++)//构造单位矩阵 res.a[i][i] = 1; ori.r = ori.c = n; //输入初始矩阵 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) scanf("%lld", &ori.a[i][j]); } } Matrix multi(Matrix x, Matrix y) { Matrix z; memset(z.a, 0, sizeof(z.a)); z.r = x.r, z.c = y.c;//新矩阵行数等于x矩阵的行数 列数等于y矩阵的列数 for(int i = 1; i <= x.r; i++)//x矩阵的行数 { for(int k = 1; k <= x.c; k++)//矩阵x的列数等于矩阵y的行数 即x.c = y.r { if(x.a[i][k] == 0) continue;//x矩阵的第i行第k列的数为0不用计算 优化 for(int j = 1; j<= y.c; j++)//y矩阵的列数 z.a[i][j] += x.a[i][k] * y.a[k][j]; } } return z; } void Matrix_mod(int n, int m) { while(m)//M次幂 二进制优化 { if(m & 1) res = multi(ori, res); ori = multi(ori, ori); m >>= 1; } //得到最后的矩阵 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) printf("%lld ", res.a[i][j]); printf("\n"); } } int main() { int N, M; while(scanf("%d%d", &N, &M) != EOF) { init(N);//初始化单位矩阵 输入原矩阵 Matrix_mod(N, M);//矩阵快速幂 } return 0; }
输入:
2 9 1 1 1 0 2 8 1 1 1 0
输出:
55 34 34 21 34 21 21 13
相关文章推荐
- STL2——关联容器
- Zhulina 的高分子刷理论
- CodeForces 445B DZY Loves Chemistry
- lvm逻辑卷管理
- 【Matlab学习笔记】(一)初识Matlab和简单计算
- 背包问题 递归思路
- 51nod 1264 线段相交(判线段相交 包括端点和部分重合)
- UICollectionView 和 UIKit
- C指针-数组和指针的归一
- 偏远的高新区
- android判断外存储卡是否安装并新建文件夹
- linux 线程 进程经典文章
- Android源码解析--超好看的下拉刷新动画
- 剑指Offer面试题:16.合并两个排序的链表
- 再次写给我们这些浮躁的程序员
- 多方法实现 swap 2 个 int 变量的值
- 队列 的理解
- ftok () 函数介绍
- 动态规划之合唱队形问题(最长递增子序列变形)
- MyBatis学习笔记(四)一多一关系