1. 程式人生 > 實用技巧 >安卓adb常用命令之二

安卓adb常用命令之二

題目大意

給定一個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;
}