1. 程式人生 > >洛谷 P3390 ——————矩陣快速冪

洛谷 P3390 ——————矩陣快速冪

P3390 【模板】矩陣快速冪

題目背景

矩陣快速冪

題目描述

給定nnn*n的矩陣A,求AkA^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<bits/stdc++.h>
using namespace std;
typedef long long ll; const int INF = 0x3f3f3f3f; const int MAXN= 110; const int MOD=1e9+7; ll b_n=0; ll N; ll C[MAXN]; ll h[MAXN]; struct mat{ll m[MAXN][MAXN]; }; mat mul(mat a,mat b) { mat tmp; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) { tmp.
m[i][j]=0; for(int k=1;k<=N;k++) tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j]+MOD)%MOD; } return tmp; } mat pow_mod(mat a,ll n) { mat ans; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++
) ans.m[i][j] = (i==j); while(n) { if(n&1) ans=mul(ans,a); a=mul(a,a); n>>=1; } return ans; } int main() { ll n,k; while(~scanf("%lld %lld",&n,&k)) { mat b; N=n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&b.m[i][j]); mat a=pow_mod(b,k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(j!=1) printf(" "); printf("%lld",a.m[i][j]); } printf("\n"); } } return 0; }