杭电1575问题 矩阵相乘问题
2012-12-19 22:01
302 查看
今天听了学长讲了一下矩阵相乘 突然感觉自己好像不懂哦 幸亏学长细心教导 呵呵
http://acm.hdu.edu.cn/showproblem.php?pid=1575
要想学矩阵相乘 首先学一下 3^1024怎么做啊 你可然觉得很简单 但你一定会超时哦 所以要小心
我感觉这个方法特好
int Pow(int a, int k){ int r=1; while(k){ if(k&1) r= r*a; a= a*a; k= k/2; //k>>= 1; // 每一次k移动一位哦 printf("%d %d %d\n", k, r, a); } return r; } void work(){ printf("%d\n", Pow(3, 14)); }
我们举一个例子哦 在这里 当k是14时 我们用二进制来表示就是1110 而K&1就是表示判断k是否是一个1还是0 如果k是1的话 r 就相乘起来哦 当如果k是0 的话就不变我这里所说的k 是用二进制表示的 k 的位数 所以这个地方要小心一点 1110=1000+100+10 这里所说的是二进制加法哦 每一次k移动一位哦
这样时间复杂度就减轻了许多哦 以前你要乘以13次才可以 现在你只要乘以4次就ok了 所以说你用这个方法你不用担心超时哦 呵呵
下面我们来讲这个题的重点了 其实如果你听懂上面的 其实下面的你也会哦
struct Matrix{ int a[size][size]; }one;
首先我们用结构体来表示矩阵哦 下面就是重点了 其实道理跟上面一样的
Matrix x; Matrix mult(Matrix x, Matrix y) { Matrix z; for(int i=0; i<size; ++i) for(int j=0; j<size; ++j){ z.a[i][j]= 0; for(int k=0; k<size; ++k){ z.a[i][j] += (x.a[i][k]*y.a[k][j])%mod; //矩阵相乘应该都知道哦 z.a[i][j] %= mod;
//mod就是题目所说的9973 } } return z; } Matrix Pow_matrix(Matrix x, int k){ Matrix r= one; while(k){ if(k&1) r= mult(r, x); x= mult(x, x); k>>= 1; //这个是移动一位哦 呵呵 } return r; }
相关文章推荐
- 杭电OJ(HDOJ)4920题:Matrix multiplication(线性代数,矩阵相乘)
- 杭电1575-Tr A(矩阵快速幂)
- 矩阵相乘问题 算法导论动态规划P197
- 石子合并问题--直线版(矩阵相乘)
- 动态规划经典问题——求矩阵相乘的最佳顺序
- 杭电1575 Tr A(矩阵快速幂)
- 矩阵相乘问题
- 杭电1081(矩阵问题)用LIS+DP解决的(有参考。)
- 矩阵相乘问题
- 算法笔记_003:矩阵相乘问题【分治法】
- 矩阵相乘顺序问题
- 两个矩阵相乘问题
- Tr A hdu 1575 二分法矩阵相乘的高次幂
- 杭电1575(矩阵快速幂)Tr A
- Java实现用传统分治法解决矩阵相乘问题
- HDOJ 题目1575 Tr A(矩阵相乘,二分)
- HDU 1575 Tr A----矩阵相乘题。
- 动态规划之矩阵连乘问题的两个矩阵相乘
- 荷兰国旗问题、矩阵相乘之Strassen算法
- c++矩阵相乘的初始值问题