题目背景
矩阵快速幂
题目描述
给定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
输入输出样例
输入 #1
2 1
1 1
1 1
输出 #1
1 1
1 1
说明/提示
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
#define mod 1000000007
using namespace std;
#define N 102
class Matrix{
public:
ll a[N][N],n;
Matrix(int _n){
n=_n;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) a[i][i]=1%mod;
}
int get(int x,int y){
return a[x][y];
}
void set(int x,int y,int val){
a[x][y]=val%mod;
}
void mul(Matrix &b){
int c[N][N]={0};
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
c[i][j]+=a[i][k]*b.a[k][j]%mod;
c[i][j]%=mod;
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) a[i][j]=c[i][j];
}
void pow(ll k){
Matrix ret(n);
while(k){
if(k&1){
ret.mul(*this);
}k>>=1;
this->mul(*this);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) a[i][j]=ret.a[i][j]%mod;
}
void display(){
for(int i=1;i<=n;i++){
printf("%lld",a[i][1]);
for(int j=2;j<=n;j++){
printf(" %lld",a[i][j]);
}
printf("\n");
}
}
};
ll n=0,k=0,temp=0;;
int main(){
scanf("%lld%lld",&n,&k);
Matrix f(n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lld",&temp);
f.set(i,j,temp);
}
}
f.pow(k);
f.display();
return 0;
}

本文深入讲解了矩阵快速幂算法,一种高效计算矩阵幂次的方法。适用于处理大规模矩阵运算,特别在计算机科学和数学领域的应用中,如求解递归序列、图形理论等。文章提供了详细的算法实现步骤和代码示例,帮助读者理解并掌握这一重要算法。
489

被折叠的 条评论
为什么被折叠?



