文章标题 CSU 1849: Comparing answers(矩阵降维+随机化思想)

来源:互联网 发布:js对cfg文件增删查改 编辑:程序博客网 时间:2024/05/21 06:26

1849: Comparing answers

这里写链接内容
题意:题意是有矩阵A,B,然后判断A*A ?= B ,直接做O(n*n*n)
分析:矩阵降维 A*A*C ?= B*C, C 是一维向量 运算顺序为 A*(A*C) 时间复杂度为O(N*N)
代码:

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<vector>#include<math.h>#include<map>#include<queue> #include<algorithm>#include<ctime>;using namespace std;const double pi=acos(-1.0);const int inf = 0x3f3f3f3f;const int maxn=100005;const double eps=1e-8; int A[1005][1005];int B[1005][1005];int tmp[1005];int n; int ans[1005][2];int judge(){    for (int i=1;i<=n;i++){        if (ans[i][0]!=ans[i][1])return 0;    }    return 1;}int main(){    srand(time(0));    while (scanf ("%d",&n)!=EOF){        if (n==0)break;        memset (A,0,sizeof (A));        memset (B,0,sizeof (B));        memset (tmp,0,sizeof (tmp));        for (int i=1;i<=n;i++)            for (int j=1;j<=n;j++)                scanf ("%d",&A[i][j]);        for (int i=1;i<=n;i++)            for (int j=1;j<=n;j++)                scanf ("%d",&B[i][j]);        for (int i=1;i<=n;i++){//随机产生一维向量            tmp[i]=rand()%8999;        }        memset (ans,0,sizeof (ans));        //计算B*tmp         for (int i=1;i<=n;i++){            for (int j=1;j<=n;j++){                ans[i][1]+=B[i][j]*tmp[j];            }        }        //计算A*tmp         for (int i=1;i<=n;i++){            for (int j=1;j<=n;j++){                ans[i][0]+=A[i][j]*tmp[j];            }        }        //将结果存在tmp中         for(int i=1;i<=n;i++){            tmp[i]=ans[i][0];            ans[i][0]=0;        }         for (int i=1;i<=n;i++){            for (int j=1;j<=n;j++){                ans[i][0]+=A[i][j]*tmp[j];            }        }        int flag=judge();        if (flag)printf ("YES\n");        else printf ("NO\n");     }    return 0; }