题目背景
矩阵快速幂
题目描述
给定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<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn=100+5; inline ll read(){ register ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll n,k; ll tmp[maxn][maxn]; struct mat { ll m[maxn][maxn]; }a,b; mat matmul(mat a,mat b){ mat t; for(register int i=1;i<=n;++i) for(register int j=1;j<=n;++j){ t.m[i][j]=0; for(register int k=1;k<=n;++k) t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%mod; } return t; } void matpow(ll p){ while(p){ if(p&1) a=matmul(a,b); b=matmul(b,b); p=p>>1; } } int main() { n=read();k=read(); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) a.m[i][j]=read(),b.m[i][j]=a.m[i][j]; matpow(k-1); for(register int i=1;i<=n;++i){ for(register int j=1;j<=n;++j) printf("%lld ",a.m[i][j]); printf(" "); } return 0; }