随机化算法比较矩阵相等 Matrix God

10人阅读 评论(0) 收藏 举报
分类:

I - Matrix God Gym - 101341I

这道题很直白,给出矩阵A,B,C;要你计算A*B是否等于C;
普通的O(n3)方法一定超时,我一直在尝试用Strassen递归的方法,发现随机化算法会简单很多,随机构造两个矩阵r1和r2,一个是1*n维,一个是n*1维,将r1*a*b*r2计算出来,就是一个整数,然后在计算r1*c*r2,结果也是一个整数。比对两个整数是否相等,这是答案的必要不充分条件,所以我们多尝试几组这样的r1,r2就可以不断的逼近真实。

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn=3000+5;
const int mod = 1e9+7;
LL a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
LL res1[maxn],res2[maxn],r1[maxn],r2[maxn],resL,resR;

int main()
{
    srand(unsigned(time(NULL)));
    //freopen("input.in","r",stdin);
    int n;
    while(scanf("%d",&n)==1) {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%lld",&a[i][j]);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%lld",&b[i][j]);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%lld",&c[i][j]);

        bool door=true;
        for(int z =0;z<5;z++)
        {
            memset(res1,0,sizeof(res1));
            memset(res2,0,sizeof(res2));
            for(int i=0;i<n;i++)
            {
                r1[i] = rand();
                r2[i] = rand();
            }
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                {
                    res1[i]+=(r1[j]*a[j][i])%mod;
                    res2[i]+=(b[i][j]*r2[j])%mod;
                    res1[i]%=mod;
                    res2[i]%=mod;
                }

            resL=resR=0;
            for(int i=0;i<n;i++)
                resL=(resL+(res1[i]*res2[i])%mod)%mod;

            memset(res1,0,sizeof(res1));
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    res1[i]=(res1[i]+(r1[j]*c[j][i])%mod)%mod;


            for(int i=0;i<n;i++)
                resR=(resR+(res1[i]*r2[i])%mod)%mod;
            if(resL!=resR){
                door=false;
                break;
            }
        }
        if(door)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

查看评论

numpy中比较两个矩阵是否相同

判断两个矩阵是否完全相同(每个元素都相同)
  • tintinetmilou
  • tintinetmilou
  • 2017-11-16 21:10:27
  • 1956

[ACM] POJ 3318 Matrix Multiplication (随机化算法)

Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1...
  • sr19930829
  • sr19930829
  • 2014-07-28 21:20:46
  • 2215

matlab 判断两个矩阵是否相等

数学意义的相等 all(A(:) == B(:)) isequal(A, B)但须注意的是:B = A,未必能保证 isequal(A, B)返回真,因为如果 A 中包含NaN,因为按照定义,NaN ...
  • lanchunhui
  • lanchunhui
  • 2016-02-22 15:53:58
  • 7588

Matlab中判断两个矩阵是否相等

>> ddd = [1 2 3 4 5 6]; >> bbb = [1 45 56 55 89 40]; >> ddd == bbbans = 1 0 0 0 ...
  • liu1137537275
  • liu1137537275
  • 2015-06-25 13:56:05
  • 6135

matlab中判断两矩阵是否相等

(1)函数isequal:Test arrays for equality. isequal(a,b); 如果a和b相等,则 ans=1,否则 ans=0. isequal 通过以下方式...
  • doujiang0710
  • doujiang0710
  • 2013-04-28 23:57:21
  • 4008

Gym - 101341I Matrix God

题意:           给出 n * n 的 A , B , C 三个矩阵,问 A * B 是否等于 C  思路:          n 太大,不能暴力。O(n^3)          ...
  • DT2131
  • DT2131
  • 2017-05-08 18:09:59
  • 203

Python numpy函数:all()和any()比较矩阵

数组元素的比对,我们可以直接使用“==”进行比较,比如: 但是当数组元素较多时,查看输出结果便变得很麻烦,这时我们可以使用all()方法,直接比对a矩阵和b矩阵的所有对应的元素是否相等。 而any...
  • qq_28618765
  • qq_28618765
  • 2017-09-25 16:19:49
  • 4113

tensorflow判断两个tensor是否完全相同

来源于解决一个csdn中的问答,问答链接:http://ask.csdn.net/questions/652382#answer_460706笔者想到的方法就是直接把bool类型转换到int处理,之后...
  • silent56_th
  • silent56_th
  • 2017-08-26 21:01:41
  • 1242

numpy中list array matrix比较

用python中的numpy包的时候不小心踩了array和matrix的大坑,又引申一下比较list array matrix之间的异同1、listlist可以明显和array、matrix区分,li...
  • u011730199
  • u011730199
  • 2017-10-11 11:43:44
  • 263

essential matrix 本质矩阵

  • 2011年01月19日 16:25
  • 1.38MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 2911
    积分: 400
    排名: 18万+