您的位置:首页 > 其它

【BZOJ 2396】神奇的矩阵 矩阵+随机

2017-02-05 11:40 274 查看
其实不要放过题目给出的每一个信息,就像这一道题,思考为什么一定是矩阵,为什么不是一个简单的数列之内的,说明解决这一道题就很用到矩阵的特殊性质。其中矩阵有一个性质就是A*B=C,C的行数等于A的行数,C的列数等于B的列数,所以我们完全可以随机构造一个n行1列的举证,然后利用矩阵乘法的结合律把矩阵变成n行1列的新矩阵,然后判断。

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 1010
#define REP(i,b) for(int i=1;i<=b;i++)
#include<cstdlib>
using namespace std;
int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn],T,n;
int ans1[maxn],ans2[maxn],ans3[maxn],rad[maxn];
int read(){
int x=0;char c=getchar();
for(;c>'9'||c<'0';c=getchar());
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
return x;
}

void mull(int a[maxn][maxn],int b[maxn],int s[maxn]){
for(int i=1;i<=n;i++){
s[i]=0;
for(int k=1;k<=n;k++){
s[i]+=a[i][k]*b[k];
}
}
}

int main(){
while(scanf("%d",&n)!=EOF){
srand(n*233);
REP(i,n)rad[i]=rand();
REP(i,n)REP(j,n)A[i][j]=read();
REP(i,n)REP(j,n)B[i][j]=read();
REP(i,n)REP(j,n)C[i][j]=read();

mull(B,rad,ans1);
mull(A,ans1,ans2);
mull(C,rad,ans3);

bool ok=false;
for(int i=1;i<=n;i++){
if(ans2[i]!=ans3[i]){ok=true;break;}
}if(ok)puts("No");
else puts("Yes");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: