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

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

  

以上是关于北邮机试 矩阵幂计算器 需要二刷 *快速幂问题的扩展的主要内容,如果未能解决你的问题,请参考以下文章

总结矩阵快速幂

浅谈矩阵快速幂

快速幂/快速幂矩阵

矩阵快速幂计算hdu1575

整数快速幂(取模)矩阵快速幂及其应用

一文彻底搞懂快速幂(原理实现矩阵快速幂)