矩阵快速幂
题目大意
给定一个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;
}
我是一颗水灵灵的大白菜,
农民伯伯辛勤的耕种着我,
把我带到了菜市场
拿着喷头对着我浇水,
还一边说“好菜啊好菜”