首页 > 其他 > 详细

北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展

时间:2020-03-06 12:34:11      阅读:51      评论:0      收藏:0      [点我收藏+]

基本思想:

快速幂的拓展,把快速幂乘法的指数部分改成矩阵即可;

 

关键点:

无;

 

#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;
}

  

北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展

原文:https://www.cnblogs.com/songlinxuan/p/12425832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!