对于矩阵乘法,本蒟蒻还是比较稀饭结构体版的,用起来极为方便
1 #include<iostream>
2 #include<cstdio>
3
4 #define LL long long
5 #define lowbit(X) X&(-X)
6 #define MOD (LL)(1e9+7)//错误点1
7 const int MAXn=1e2+1;
8 using namespace std;
9
10 inline int read()
11 {
12 int x=0,f=1;
13 char c=getchar();
14 while(c<'0' || c>'9'){
15 if(c=='-') f=-1;
16 c=getchar();
17 }
18 while(c>='0' && c<='9'){
19 x=x*10+c-'0';
20 c=getchar();
21 }
22 return x*f;
23 }
24
25 struct Node{
26 LL Side,Fac;
27 LL Squ[MAXn][MAXn];
28
29 inline void Clear_S(LL x)
30 {
31 for(int i=1;i<=Side;i++)
32 for(int j=1;j<=Side;j++)
33 Squ[i][j]=x;
34 }
35
36 friend istream &operator >> (istream &, Node &A)
37 {
38 cin>>A.Side>>A.Fac;//关键点2
39 for(int i=1;i<=A.Side;i++)
40 for(int j=1;j<=A.Side;j++) cin>>A.Squ[i][j];
41 return cin;
42 }
43
44 friend ostream &operator << (ostream &, Node &A)
45 {
46 for(int i=1;i<=A.Side;i++){
47 for(int j=1;j<=A.Side;j++) cout<<A.Squ[i][j]<<" ";
48 cout<<endl;
49 }
50 return cout;
51 }
52
53 Node operator * (const Node &X)//关键点3
54 {
55 Node Temp=X;
56 Temp.Clear_S(0);
57 for(int i=1;i<=X.Side;i++)
58 for(int j=1;j<=X.Side;j++)
59 for(int k=1;k<=X.Side;k++) Temp.Squ[i][j]=(Temp.Squ[i][j]+(X.Squ[i][k] * Squ[k][j]) % MOD)%MOD;
60 return Temp;
61 }
62
63 /* friend Node operator * (Node &X , Node &Y)
64 {
65 Node Temp=X;
66 Temp.Clear_S(0);
67 for(int i=1;i<=X.Side;i++)
68 for(int j=1;j<=X.Side;j++)
69 for(int k=1;k<=X.Side;k++) Temp.Squ[i][j]=(Temp.Squ[i][j]+(X.Squ[i][k] * Y.Squ[k][j]) % MOD)%MOD;
70 return Temp;
71 }
72 */
73
74 }New,Ans;
75
76 inline void Sta()
77 {
78 Ans=New;Ans.Clear_S(0);
79 for(int i=1;i<=New.Side;i++) Ans.Squ[i][i]=1;
80 }
81
82 inline void BOB_Work()
83 {
84 Sta();
85 while(New.Fac){
86 if(New.Fac & 1) Ans=Ans*New;
87 New=New*New;
88 New.Fac >>= 1;
89 }
90 cout<<Ans;
91 }
92
93 int main()
94 {
95 cin>>New;
96 BOB_Work();
97 return 0;
98 }
99
来源:https://www.cnblogs.com/DeNeRATe/p/12219596.html