对于矩阵乘法,本蒟蒻还是比较稀饭结构体版的,用起来极为方便
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