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

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

题目背景

矩阵快速幂

题目描述

给定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 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define LL long long
 8 using namespace std;
 9 const int mod=1e9+7;
10 const int mxn=105;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
14     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
15     return x*f;
16 }
17 int n;
18 struct matrix{
19     int s[mxn][mxn];
20     matrix(){memset(s,0,sizeof s);}
21 };
22 matrix operator * (const matrix a,const matrix b){
23     matrix c;
24     for(int i=1;i<=n;i++)
25      for(int j=1;j<=n;j++)
26       for(int k=1;k<=n;k++)
27           c.s[i][j]=((LL)c.s[i][j]+(LL)a.s[i][k]*b.s[k][j])%mod;
28     return c;
29 }
30 LL k;
31 matrix a;
32 int main(){
33     int i,j;
34     scanf("%d%lld",&n,&k);
35     for(i=1;i<=n;i++)
36      for(j=1;j<=n;j++)
37       a.s[i][j]=read();
38     matrix ans=a;
39     k--;
40     while(k){
41         if(k&1)ans=ans*a;
42         k>>=1;
43         a=a*a;
44     }
45     for(i=1;i<=n;i++){
46         for(j=1;j<=n;j++){
47             printf("%d ",ans.s[i][j]);
48         }
49         printf("
");
50     }
51     return 0;
52 }