题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余。
分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因。
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 800+10; 8 using namespace std; 9 int n, a[maxn][maxn], b[maxn][maxn], c[maxn][maxn]; 10 11 int main() 12 { 13 int i, j, k; 14 while(~scanf("%d", &n)) 15 { 16 memset(a, 0, sizeof(a)); 17 memset(b, 0, sizeof(b)); 18 memset(c, 0, sizeof(c)); 19 for(i = 0; i < n; i++) 20 for(j = 0; j < n; j++) 21 { 22 scanf("%d", &a[i][j]); 23 a[i][j] %= 3; 24 } 25 for(i = 0; i < n; i++) 26 for(j = 0; j < n; j++) 27 { 28 scanf("%d", &b[i][j]); 29 b[i][j] %= 3; 30 } 31 32 for(i = 0; i < n; i++) 33 { 34 for(k = 0; k < n; k++) 35 if(a[i][k]!=0) 36 for(j = 0; j < n; j++) 37 { 38 c[i][j] += a[i][k]*b[k][j]; 39 //c[i][j] %= 3; 加这个会超时 40 } 41 } 42 for(i = 0; i < n; i++) 43 { 44 for(j = 0; j < n; j++) 45 if(j == 0) 46 printf("%d", c[i][j]%3); 47 else 48 printf(" %d", c[i][j]%3); 49 printf("\n"); 50 } 51 } 52 return 0; 53 }
再贴一个崔老师的代码:
他把所有的0都忽略了,很巧妙的优化,aa[][], bb[][]里存储的是下一个不为0的位置:
1 #include <iostream> 2 #include<stdio.h> 3 #include<vector> 4 #include<queue> 5 #include<stack> 6 #include<string.h> 7 #include<algorithm> 8 #include<map> 9 using namespace std; 10 #define LL long long 11 #define gcd(a,b) (b==0?a:gcd(b,a%b)) 12 #define lcm(a,b) (a*b/gcd(a,b)) 13 //O(n)求素数,1-n的欧拉数 14 #define N 100010 15 //A^x = A^(x % Phi(C) + Phi(C)) (mod C) 16 int a[880][880]; 17 int b[880][880]; 18 int aa[880][880]; 19 int bb[880][880]; 20 int c[880][880]; 21 int main() 22 { 23 int n; 24 while(~scanf("%d",&n)) 25 { 26 memset(a,0,sizeof(a)); 27 memset(b,0,sizeof(b)); 28 memset(aa,0,sizeof(aa)); 29 memset(bb,0,sizeof(bb)); 30 memset(c,0,sizeof(c)); 31 for(int i=1;i<=n;i++) 32 { 33 for(int j=1;j<=n;j++) 34 { 35 scanf("%d",&a[i][j]); 36 a[i][j]%=3; 37 } 38 } 39 for(int i=1;i<=n;i++) 40 { 41 for(int j=1;j<=n;j++) 42 { 43 scanf("%d",&b[i][j]); 44 b[i][j]%=3; 45 } 46 } 47 for(int i=1;i<=n;i++) 48 { 49 int x=-1; 50 for(int j=n;j>=0;j--) 51 { 52 aa[i][j]=x; 53 if(a[i][j])x=j; 54 } 55 } 56 for(int i=1;i<=n;i++) 57 { 58 int x=-1; 59 for(int j=n;j>=0;j--) 60 { 61 bb[i][j]=x; 62 if(b[i][j])x=j; 63 } 64 } 65 for(int i=1;i<=n;i++) 66 { 67 for(int j=aa[i][0];j!=-1;j=aa[i][j]) 68 { 69 for(int k=bb[j][0];k!=-1;k=bb[j][k]) 70 c[i][k]+=a[i][j]*b[j][k]; 71 } 72 } 73 for(int i=1;i<=n;i++) 74 { 75 for(int j=1;j<=n;j++) 76 { 77 printf("%d",c[i][j]%3); 78 if(j!=n)printf(" "); 79 else printf("\n"); 80 } 81 } 82 } 83 return 0; 84 }
hdu 4920 Matrix multiplication (矩阵计算),布布扣,bubuko.com
时间: 2024-12-26 02:43:16