求矩阵和的问题。这题我参考罗牛的思路,把前K次和分解为2的幂和,比如25 = 1+8+16。比较郁闷的是,我的代码和他的比,可以说除了变量名其它都一样,结果人家跑16ms,我的141ms。

 1 #include <cstdio>
 2 int m,n,K;
 3 int pow[30][31][31],sum[30][31][31];
 4 void add(int a[31][31],int b[31][31],int c[31][31])
 5 {
 6     for(int i = 0; i < n; i++)
 7         for(int j = 0; j < n; j++)
 8             a[i][j] = (c[i][j]+b[i][j])%m;
 9 }
10 void mul(int a[31][31],int b[31][31],int c[31][31])
11 {
12     int i,j,k;
13     for(i = 0; i < n; i++)
14         for(j = 0; j < n; j++)
15         {
16             a[i][j] = 0;
17             for(k = 0; k < n; k++)
18                 a[i][j] = (a[i][j]+b[i][k]*c[k][j])%m;
19         }
20 
21 }
22 int main()
23 {
24     int i,j,t;
25     int tmp[31][31],ans[31][31]={};
26     scanf("%d%d%d",&n,&K,&m);
27     for(i = 0; i < n; i++)
28         for(j = 0; j < n; j++)
29         {
30             scanf("%d",&t);
31             pow[0][i][j] = sum[0][i][j] = t%m;
32         }
33     for(i = 1; (1<<i) <= K; i++)
34     {
35         mul(pow[i],pow[i-1],pow[i-1]);
36         mul(tmp,sum[i-1],pow[i-1]);
37         add(sum[i],tmp,sum[i-1]);
38     }
39     for(i = 0; K; K>>=1,i++)
40     {
41         if(K&1)
42         {
43             mul(tmp,ans,pow[i]);
44             add(ans,tmp,sum[i]);
45         }
46     }
47     for(i = 0; i < n; i++)
48     {
49         printf("%d",ans[i][0]);
50         for(j = 1; j < n; j++)
51             printf(" %d",ans[i][j]);
52         printf("\n");
53     }
54     return 0;
55 }