求矩阵和的问题。这题我参考罗牛的思路,把前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 }