大概介绍两种写矩阵的方法,各有优缺点。
一种是用结构体实现,也许运行起来会比较快?
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(推公式),嗯=。= 记住这点就好。