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

    xiaoxiao2021-03-26  19

    其实不要放过题目给出的每一个信息,就像这一道题,思考为什么一定是矩阵,为什么不是一个简单的数列之内的,说明解决这一道题就很用到矩阵的特殊性质。其中矩阵有一个性质就是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; }

    转载请注明原文地址: https://ju.6miu.com/read-660014.html

    最新回复(0)