码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1140 矩阵相乘结果的判断

时间:2017-10-28 20:26:01      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:ptr   ide   one   pre   size   char   ems   rand   mil   

给出三个N*N的矩阵A, B, C,问A * B是否等于C?
 
Input
第1行,1个数N。(0 <= N <= 500)
第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16)
第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16)
第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2
1 0
0 1
0 1
1 0
0 1
1 0
Output示例
Yes
——————————————————————
这题如果直接乘a b矩阵要 n^3 方 那么肯定会T
我们可以考虑引进一个向量 也就是1*n的矩阵 和 a b c 乘起来
判断是否相等就可以辣 这样是n^2的复杂度
如果担心不准 可以多rand几个1*n的矩阵多次比较
技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
using std::max;
const int M=557;
char buf[33*M*M],*ptr=buf-1;
int read(){
    int ans=0,f=1,c=*++ptr;
    while(c<0||c>9){if(c==-) f=-1; c=*++ptr;}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=*++ptr;}
    return ans*f;
}
int n;
typedef int mat[M][M];
mat a,b,c;
int ly[M],yy[M],tmp[M];
int main(){
    fread(buf,1,sizeof(buf),stdin);
    n=read();
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=read();
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=read();
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c[i][j]=read();
    
    for(int i=1;i<=n;i++) ly[i]=rand();
    for(int i=1;i<=n;i++) yy[i]=ly[i];
    
    for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) tmp[k]+=ly[j]*a[j][k];
    for(int i=1;i<=n;i++) ly[i]=tmp[i];
    memset(tmp,0,sizeof(tmp));
    for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) tmp[k]+=ly[j]*b[j][k];
    for(int i=1;i<=n;i++) ly[i]=tmp[i];
    
    memset(tmp,0,sizeof(tmp));
    for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) tmp[k]+=yy[j]*c[j][k];
    for(int i=1;i<=n;i++)if(ly[i]!=tmp[i]) return puts("No"),0;
    puts("Yes");
    return 0;
}
View Code

 

 

51nod 1140 矩阵相乘结果的判断

标签:ptr   ide   one   pre   size   char   ems   rand   mil   

原文地址:http://www.cnblogs.com/lyzuikeai/p/7747788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!