矩阵快速幂

题目大意

给定一个m阶矩阵\(A\)和一个数n,输出\(A^n\)

Input

第一行输入两个数m,n分别矩阵的行数,以及所要求的矩阵的幂次方数
随后m行每行有m个数,
第i行第j个输入的数,代表矩阵的第i行第j列的元

Output

输出\(A^n\)
当然这个结果可能很大,要求你对结果取模1000000007(即\(10^{9}+7\))后输出

#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
//简化声明一个矩阵

const ll md = 1e9 + 7;
//矩阵乘法
mat mul(const mat& a, const mat& b) {
	mat res(a.size(), vec(b[0].size()));
	//初始化res,取a的行,每行有b[0].size()个 0、
	//易得,行==列

	//矩阵乘法
	for (int i = 0; i < a.size(); ++i) {
		for (int k = 0; k < b.size(); ++k) {
			for (int j = 0; j < b[0].size(); ++j) {
				res[i][j] = (res[i][j] + a[i][k] * b[k][j] % md) % md;
			}
		}
	}
	return res;
}

//矩阵快速幂
mat Quickpow(mat a, ll n) {
	mat res(a.size(), vec(a.size()));
	//初始化一个值都为0的方阵
	for (int i = 0; i < a.size(); ++i)res[i][i] = 1;
	//单位矩阵E
	while (n) {
		if (n & 1)res = mul(res, a);
		a = mul(a, a);
		n >>= 1;
	}
	return res;
}
posted @ 2020-11-13 14:41  幽灵轩  阅读(84)  评论(0编辑  收藏  举报