bzoj2396: 神奇的矩阵
与51nod1140一样。不过这题是多组数据的。。。坑。。。。
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<ctime> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) #define ll long long int read(){ int x=0,f=1;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1;c=getchar(); } while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x*f; } const int nmax=1005; ll r[nmax],ra[nmax],rb[nmax],rc[nmax],a[nmax][nmax],b[nmax][nmax],c[nmax][nmax]; int main(){ srand(1000007); int n;bool flag; while(scanf("%d",&n)==1){ rep(i,1,n) rep(j,1,n) a[i][j]=read(); rep(i,1,n) rep(j,1,n) b[i][j]=read(); rep(i,1,n) rep(j,1,n) c[i][j]=read(); rep(i,1,n) r[i]=rand()%1000,ra[i]=rb[i]=rc[i]=0; rep(j,1,n) rep(k,1,n) ra[j]+=r[k]*a[k][j]; rep(j,1,n) rep(k,1,n) rb[j]+=ra[k]*b[k][j]; rep(j,1,n) rep(k,1,n) rc[j]+=r[k]*c[k][j]; flag=1; rep(i,1,n) if(rc[i]!=rb[i]){ printf("No\n");flag=0; } if(flag) printf("Yes\n"); } return 0; }
2396: 神奇的矩阵
Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1042 Solved: 298
[Submit][Status][Discuss]
Description
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。
Input
题目可能包含若干组数据。
对于每组数据,第一行一个数N,接下来给出三个N*N的矩阵,依次为A、B、C三个矩阵。
Output
对于每组数据,若A*B=C成立,则输出Yes,否则No。每个答案占一行。
Sample Input
1
2
2
100
2
2
100
Sample Output
No
HINT
对于90%的数据,N不超过100;
对于100%的数据,N不超过1000,矩阵中的数字大于等于0小于1000,数据组数不超过5组。