G03【模板】矩阵快速幂

G03【模板】矩阵快速幂_哔哩哔哩_bilibili

 

矩阵 - OI Wiki

 

P3390 【模板】矩阵快速幂 - 洛谷

// 矩阵快速幂 O(n^3*logk)
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int mod=1000000007;
LL n,k;
struct matrix{
  LL c[101][101];
  matrix(){memset(c,0,sizeof c);}
}A,res;

void mul(matrix &z,matrix &x,matrix &y){
  matrix t; //临时矩阵
  for(int i=1;i<=n;i++)
  for(int j=1;j<=n;j++)
  for(int k=1;k<=n;k++)
    t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
  z=t;
}
void qsm(LL k){
  for(int i=1;i<=n;i++) res.c[i][i]=1; //单位矩阵
  while(k){
    if(k&1) mul(res,res,A); //矩阵乘法
    mul(A,A,A);
    k>>=1;
  }
}
int main(){
  scanf("%d%lld",&n,&k);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)scanf("%d",&A.c[i][j]);
  
  qsm(k);//矩阵快速幂
  for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++)printf("%d ",res.c[i][j]);
    puts("");
  }
  return 0;
}

 

// 矩阵快速幂 O(n^3*logk)
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int mod=1000000007;
LL n,k;
struct matrix{
  LL c[101][101];
  matrix(){memset(c,0,sizeof c);}
}A,res;

matrix operator*(matrix &x,matrix &y){
  matrix t; //临时矩阵
  for(int i=1;i<=n;i++)
  for(int j=1;j<=n;j++)
  for(int k=1;k<=n;k++)
    t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
  return t;
}
void qsm(LL k){
  for(int i=1;i<=n;i++) res.c[i][i]=1; //单位矩阵
  while(k){
    if(k&1) res=res*A; //矩阵乘法
    A=A*A;
    k>>=1;
  }
}
int main(){
  scanf("%d%lld",&n,&k);
  for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)scanf("%d",&A.c[i][j]);
  
  qsm(k);//矩阵快速幂
  for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++)printf("%d ",res.c[i][j]);
    puts("");
  }
  return 0;
}

 

posted @ 2022-09-08 15:33  董晓  阅读(1619)  评论(0)    收藏  举报