北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展
Posted songlinxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展相关的知识,希望对你有一定的参考价值。
基本思想:
快速幂的拓展,把快速幂乘法的指数部分改成矩阵即可;
关键点:
无;
#include<iostream> #include<string> #include<vector> #include<map> #include<set> using namespace std; const int maxn = 15; int n, k; vector<vector<int>> multi(vector<vector<int>>m1, vector<vector<int>>m2) { vector<vector<int>> m3; m3.resize(n); for (int i = 0; i < n; i++) { m3[i].resize(n); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { m3[i][j] += m1[i][k] * m2[k][j]; } } } return m3; } vector<vector<int>> quckmatrix(vector<vector<int>> m) { vector<vector<int>> ans=m; vector<vector<int>> res; res.resize(n); for (int i = 0; i < n; i++) { res[i].resize(n); } for (int i = 0; i < n; i++) { //单位矩阵 res[i][i] = 1; } while (k > 0) { //对k二进制进行操作; if (k % 2 == 1) { res = multi(res, ans); } k /= 2; ans = multi(ans, ans); } return res; } int main() { while (cin >> n >> k) { vector<vector<int>> ma; ma.resize(n); for (int i = 0; i < n; i++) { ma[i].resize(n); } for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { cin >> ma[j][k]; } } ma = quckmatrix(ma); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j == 0) cout << ma[i][j]; else cout << " " << ma[i][j]; } cout << endl; } } return 0; }
以上是关于北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展的主要内容,如果未能解决你的问题,请参考以下文章