【模板】矩阵快速幂

题目描述

给定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 算法:矩阵快速幂

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 using namespace std;
 8 typedef long long ll;
 9 const int N=105,mod=1000000007;
10 int n;ll k;
11 struct mat{
12     ll a[N][N];
13     inline mat operator *(const mat &b)const{
14         mat tmp;
15         for(int i=1;i<=n;i++)
16             for(int j=1;j<=n;j++)
17                 {
18                     tmp.a[i][j]=0;
19                     for(int k=1;k<=n;k++)
20                         tmp.a[i][j]+=a[i][k]*b.a[k][j],tmp.a[i][j]%=mod;
21                 }
22         return tmp;
23     }
24 }a;
25 mat qm(mat a,ll k){
26     mat tmp=a;k--;
27     while(k){
28         if(k&1)tmp=tmp*a;
29         k>>=1;a=a*a;
30     }
31     return tmp;
32 }
33 int main()
34 {
35 
36     scanf("%d%lld",&n,&k);
37     for(int i=1;i<=n;i++)
38         for(int j=1;j<=n;j++)
39             scanf("%lld",&a.a[i][j]);
40     a=qm(a,k);
41     for(int i=1;i<=n;i++){
42         for(int j=1;j<=n;j++)
43             printf("%lld ",a.a[i][j]);
44         puts("");
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/Yuzao/p/7138168.html