3233

1 /*
2 数学题,矩阵相乘
3
4 关于二维矩阵在递归上的分析搞的我头大了,错了,也不知道哪错了。~
5
6 S = A + A^2 + A^3 + A^4 + A^5 + ...
7
8 B = A I A I
9 0 I 0 I
10
11 B^2 = A^2 A+I A I
12 0 I 0 I
13
14 B^3 = A^3 A^2+A+I A I
15 0 I 0 I
16
17 B^4 = A^4 A^3+A^2+A^1+I
18 0 I
19
20
21 */
22
23 // include file
24 #include <cstdio>
25 #include <cstdlib>
26 #include <cstring>
27 #include <cmath>
28 #include <cctype>
29 #include <ctime>
30
31 #include <iostream>
32 #include <sstream>
33 #include <fstream>
34 #include <iomanip>
35 #include <bitset>
36 #include <strstream>
37
38 #include <algorithm>
39 #include <string>
40 #include <vector>
41 #include <queue>
42 #include <set>
43 #include <list>
44 #include <functional>
45
46 using namespace std;
47
48 // typedef
49 typedef long long LL;
50 typedef unsigned long long ULL;
51 typedef __int64 Bint;
52
53 //
54 #define read freopen("in.txt","r",stdin)
55 #define write freopen("out.txt","w",stdout)
56 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
57 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
58 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
59 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
60 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
61 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
62 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
63
64 #define FF(i,a) for(int i=0;i<(a);i+++)
65 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
66 #define Z(a) (a<<1)
67 #define Y(a) (a>>1)
68
69 const double eps = 1e-6;
70 const double INFf = 1e10;
71 const int INFi = 1000000000;
72 const double Pi = acos(-1.0);
73
74 template<class T> inline T sqr(T a){return a*a;}
75 template<class T> inline T TMAX(T x,T y)
76 {
77 if(x>y) return x;
78 return y;
79 }
80 template<class T> inline T TMIN(T x,T y)
81 {
82 if(x<y) return x;
83 return y;
84 }
85 template<class T> inline void SWAP(T &x,T &y)
86 {
87 T t = x;
88 x = y;
89 y = t;
90 }
91 template<class T> inline T MMAX(T x,T y,T z)
92 {
93 return TMAX(TMAX(x,y),z);
94 }
95
96
97 // code begin
98 #define MAXN 70
99 int N,K,M;
100 int mx[MAXN][MAXN];
101 int mxz[MAXN][MAXN];
102 int mxy[MAXN][MAXN];
103 int mxl[MAXN][MAXN];
104 int mxr[MAXN][MAXN];
105 int ans[MAXN][MAXN];
106 int t1[MAXN][MAXN];
107 int t2[MAXN][MAXN];
108
109 void mx_multi(int r1[][MAXN],int r2[][MAXN],int res[][MAXN])
110 {
111
112 FORi(1,N+1,1)
113 {
114 FORj(1,N+1,1)
115 {
116 t1[i][j] = r1[i][j];
117 t2[i][j] = r2[i][j];
118 res[i][j] = 0;
119 }
120 }
121 //memcpy(t1,r1,sizeof(int)*MAXN*MAXN);
122 //memcpy(t2,r2,sizeof(int)*MAXN*MAXN);
123 FORi(1,N+1,1)
124 {
125 FORj(1,N+1,1)
126 {
127 if(t1[i][j]!=0)
128 {
129 FORk(1,N+1,1)
130 {
131 res[i][k] = (res[i][k] + (t1[i][j]*t2[j][k])%M)%M;
132 }
133 }
134 }
135 }
136 }
137
138 void bin_mx(int n,int res[][MAXN])
139 {
140 //原始矩阵乘n次
141 if(n==1)
142 {
143 /*
144 FORi(1,N+1,1)
145 {
146 FORj(1,N+1,1)
147 {
148 res[i][j] = mx[i][j];
149 }
150 }
151 */
152 memcpy(res,mx,sizeof(int)*MAXN*MAXN);
153 return;
154 }
155
156 //
157 if(n&1)
158 {
159 // 奇数
160 bin_mx(Y(n),mxl);
161 // mxl^2 * mx = res
162 mx_multi(mxl,mxl,mxr);
163 mx_multi(mxr,mx,res);
164 }
165 else
166 {
167 //偶数
168 bin_mx(Y(n),mxl);
169 mx_multi(mxl,mxl,res);
170 }
171 }
172
173 int main()
174 {
175 read;
176 write;
177 while(scanf("%d %d %d",&N,&K,&M)!=-1)
178 {
179 memset(mx,0,sizeof(mx));
180 FORi(1,N+1,1)
181 {
182 FORj(1,N+1,1)
183 {
184 scanf("%d",&mx[i][j]);
185 mx[i][j] %= M;
186 ans[i][j] = 0;
187 }
188 }
189 //构造新的矩阵B
190 FORi(1,N+1,1)
191 {
192 mx[i][N+i] = 1;
193 }
194 FORi(N+1,2*N+1,1)
195 {
196 mx[i][i] = 1;
197 }
198 N = 2*N;
199
200 bin_mx(K+1,ans);
201
202 FORi(1,N/2+1,1)
203 {
204 if(i+N/2==N/2+1) printf("%d",ans[i][N/2+1]-1);
205 else printf("%d",ans[i][N/2+1]);
206 FORj(N/2+2,N+1,1)
207 {
208 if(i+N/2==j) printf(" %d",ans[i][j]-1);
209 else printf(" %d",ans[i][j]);
210 }
211 printf("\n");
212 }
213
214 }
215 return 0;
216 }
posted @ 2011-03-09 18:39  AC2012  阅读(878)  评论(0编辑  收藏  举报