【模板】矩阵快速幂

【模板】矩阵快速幂

题目背景

矩阵快速幂

题目描述

给定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<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define MOD 1000000007
 6 #define LL long long 
 7 using namespace std;
 8 LL a[105][105],b[105][105],c[105][105],k;
 9 int n;
10 void inti()
11 {
12        scanf("%d%lld",&n,&k);
13     for (int i=1;i<=n;i++) 
14         for (int j=1;j<=n;j++) scanf("%lld",&a[i][j]);
15     for (int i=1;i<=n;i++) b[i][i]=1;
16 }
17 void hc()
18 {  
19     for(LL i=1;i<=n;i++)
20     for(LL j=1;j<=n;j++)
21     {
22           c[i][j]=0;
23           for(LL k=1;k<=n;k++)
24            c[i][j]=(c[i][j]+b[i][k]*a[k][j]%MOD)%MOD;
25       
26     }
27     for(LL i=1;i<=n;i++)
28     for(LL j=1;j<=n;j++)
29     b[i][j]=c[i][j];
30 } 
31 void zc()
32 {
33     for(LL i=1;i<=n;i++)
34     for(LL j=1;j<=n;j++)
35     {
36           c[i][j]=0;
37           for(LL k=1;k<=n;k++)
38           c[i][j]=(c[i][j]+a[i][k]*a[k][j]%MOD)%MOD;
39     }
40     for(LL i=1;i<=n;i++)
41     for(LL j=1;j<=n;j++)
42     a[i][j]=c[i][j];
43 }
44 void work()
45 {
46     while(k)
47     {
48         if(k%2==1) hc();
49         zc();
50         k=k/2;
51     }
52     for(LL i=1;i<=n;i++)
53     {
54       for(LL j=1;j<=n;j++)
55        cout<<b[i][j]<<" "; 
56       cout<<endl;
57     }
58 }
59 int main()
60 {
61     inti();
62     work();
63     return 0;
64 }
View Code

以上 By LQ_double

posted @ 2016-11-14 21:46  Native_carrot  阅读(218)  评论(0编辑  收藏  举报