矩阵模板

大概介绍两种写矩阵的方法,各有优缺点。

一种是用结构体实现,也许运行起来会比较快?

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int mod = (int)1e9+7 ;
 5 
 6 void add (int &a , int b) {
 7     a += b ; if (a<0) a+=mod ; if (a>=mod) a-=mod ;
 8 }
 9 
10 struct mat {
11     int e[50][50] , n , m ;
12     mat () {}
13     mat (int _n , int _m) : n(_n) , m(_m) {
14         for (int i=0 ; i<n ; i++) memset (e[i],0,sizeof(int)*m) ;
15     }
16     mat operator * (const mat &rhs) { 
17         mat ret(n,rhs.m) ;
18         for (int i=0 ; i<n ; i++)
19             for (int j=0 ; j<rhs.m ; j++)
20                 for (int z=0 ; z<m ; z++)
21                     add(ret.e[i][j],1ll*e[i][z]*rhs.e[z][j]%mod) ;
22         return ret ;
23     }
24 } ;
25 
26 int main () {
27     //请赋值
28     mat b(3,3) ;
29     //建立单位矩阵
30     mat ans(3,3) ;
31     for (int i=0 ; i<3 ; i++) ans.e[i][i] = 1 ;
32     int cnt = 1000000000 ;
33     for ( ; cnt ; cnt>>=1) {
34         if (cnt&1) ans = ans*b ;
35         b = b*b ;
36     }
37     return 0 ;
38 }

另外一种是利用vector<>,用vector<vector<> >来定义矩阵的类型,写起来很快?

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef vector<int> vec ;
 5 typedef vector<vec> mat ;
 6 const int mod = (int)1e9+7 ;
 7 
 8 inline void add (int &a ,int b) {
 9     a += b ; if (a>=mod) a-=mod ; if (a<0) a+=mod ;
10 }
11 
12 mat mul (const mat &a , const mat &b) {
13     mat ret(a.size(),vec(b[0].size())) ;
14     for (int i=0 ; i<a.size() ; i++)
15         for (int j=0 ; j<b[0].size() ; j++)
16             for (int z=0 ; z<b.size() ; z++)
17                 add(ret[i][j],1ll*a[i][z]*b[z][j]%mod) ;
18     return ret ;
19 }
20 
21 int main () {
22     mat b(3,vec(3)) ;
23     for (int i=0 ; i<3 ; i++) for (int j=0 ; j<3 ; j++) scanf("%d",&b[i][j]);
24     mat ans(3,vec(3)) ;
25     for (int i=0 ; i<ans.size() ; i++) ans[i][i] = 1 ;
26     int cnt = 1000000000 ;
27     for ( ; cnt ; cnt>>=1) {
28         if (cnt&1) ans = mul(ans , b) ;
29         b = mul(b , b) ;
30     }
31     return 0 ;
32 }

可以把这个看一下 https://github.com/halfapri/half/tree/master/carbuncle/Matrix

理论上来说其实看了也不能a题。。。所以你们可以好好看看大牛们的博客。反正核心是dp(推公式),嗯=。= 记住这点就好。

posted @ 2016-07-20 17:21  92度的苍蓝  阅读(461)  评论(0编辑  收藏  举报
http://images.cnblogs.com/cnblogs_com/Running-Time/724426/o_b74124f376fc157f352acc88.jpg