矩阵乘法

蹲街弑〆低调 提交于 2020-01-20 22:31:19

对于矩阵乘法本蒟蒻还是比较稀饭结构体版的,用起来极为方便

 

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

 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  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!