3990 [模板]矩阵快速幂 洛谷luogu
题目背景
矩阵快速幂
题目描述
给定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
输入输出样例
说明
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂
-------------------------------------------------
ahaha operator *(const ahaha &x,const ahaha &y){ //重载运算符
//ahaha 是自定义的结构体
ahaha z;
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
return z;
}
重载运算符
---------------------------------------------------------------------------------
#include<iostream> #include<cstring> #define mod 1000000007 #define ll long long using namespace std;#include<iostream> #include<cstring> #define mod 1000000007 #define ll long long using namespace std; struct Mat{ ll m[101][101]; };//结构体存矩阵 Mat a,e;//a是输入的矩阵,e是单位矩阵 ll n,p; Mat Mul(Mat x,Mat y) //矩阵乘 { Mat c; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.m[i][j]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod; } return c; } Mat pow(Mat x,ll y) //矩阵快速幂 { Mat ans=e; while(y) { if(y&1) ans=Mul(ans,x); x=Mul(x,x); y>>=1; } return ans; } int main() { //输入 cin>>n>>p; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a.m[i][j]; //算法核心 for(int i=1;i<=n;i++) e.m[i][i]=1; Mat ans=pow(a,p); //输出 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<ans.m[i][j]%mod<<" "; cout<<endl; } return 0;