0
点赞
收藏
分享

微信扫一扫

矩阵快速幂模板

AbrahamW 2022-06-17 阅读 56

设A为m * k的矩阵,B为k * n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB,其中矩阵C中的第i行第j列元素为A的第i行与B的第j列对应的元素乘积和。

当矩阵A的列数等于矩阵B的行数时,A与B可以相乘
矩阵C的行数等于A的行数,C的列数等于B的列数。
C的第i行第j列的元素等于矩阵A的第i行的元素与矩阵B的第j列对应元素乘积之和。

题目描述
给定n*n的矩阵A,求A^k
输入输出格式
输入格式:
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD 1000000007
using namespace std;

typedef long long ll;
struct mat{
ll a[105][105];
}ans, res;
ll k, n;

mat mul(mat x, mat y, ll n)
{
mat t;
memset(t.a, 0, sizeof(t.a));
for (int i=1; i<=n; i++){
for (int j=1; j<=n; j++){
for (int k=1; k<=n; k++){
t.a[i][j]+=x.a[i][k] * y.a[k][j];
t.a[i][j]%=MOD;
}
}
}
return t;
}
void quick_mod(ll n, ll N)
{
for (int i=1; i<=n; i++){//初始化ans,类似于a的b次幂,ans=1
for (int j=1; j<=n; j++){
if (i==j)
ans.a[i][j]=1;
else
ans.a[i][j]=0;
}
}
while (N){
if (N&1)
ans=mul(ans, res, n);
res=mul(res, res, n);
N>>=1;
}
}
int main()
{
scanf("%lld%lld", &n, &k);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
scanf("%lld", &res.a[i][j]);

quick_mod(n, k);

for (int i=1; i<=n; i++){
for (int j=1; j<=n; j++){
if (j!=n) printf("%lld ", ans.a[i][j]);
else printf("%lld", ans.a[i][j]);
}
printf("\n");
}
return 0;
}


举报

相关推荐

0 条评论