矩阵乘法优化--poj3318 随机矩阵

来源:互联网 发布:萧航网络 编辑:程序博客网 时间:2024/06/09 14:38

给定矩阵A,B,C,求检验A * B 是否等于C。n = 500

普通矩阵乘法是O(n^3)

但是如果用一个1 * n的矩阵和n * n矩阵相乘只需要O(n^2),所以可以用一个随机矩阵R * A * B ?= R * C

//rand()随机生成[0,RAND_MAX]的数

//如果想要[0,n]内的随机数

//nRAND_MAX小,取余

//nRAND_MAX大,1.0 * rand() / RAND_MAX可以得到[0,1]内随机数,再乘以n即可(ps:在n很大时时候会产生锯齿,精度不大)

//1.为什么用int,用long long就过不了?

//2.g++re c++ac?

//!随机矩阵要对n取余!

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <ctime>

#include <cstring>

using namespacestd;

const int maxn =500 +5;

const int mod =1e9 +7;


class matrix{

public:

    int sz;

    int m[maxn][maxn];

    matrix (int n) {sz = n;init();}

    void init(){

        memset(m,0,sizeof(m));

        for (int i =0; i <sz; i ++) {

            m[i][i] =1;

        }

    }

    void input(){

        for (int i =0; i <sz; i ++) {

            for (int j =0; j <sz; j ++) {

                scanf("%d",&m[i][j]);

            }

        }

    }

};

class rand_m{

public:

    int sz;

    int m[maxn];

    rand_m (int n) {sz = n;}

    void init_rand(){

        int t =rand();

        for (int i =0; i <sz; i ++) {

        t = rand();

            m[i] = t % sz;

        }

    }

    void init(){

        memset(m,0,sizeof(m));

    }

};

void multiply(rand_m &rd,matrix &a,rand_m &l)

{

    for (int i =0; i < rd.sz; i ++) {

        int sum =0;

        for (int j =0; j < rd.sz; j ++) {

            sum = (sum % mod + rd.m[j] * a.m[j][i] %mod) % mod;

        }

        l.m[i] = sum;

    }

}


int main()

{

    srand((unsigned)time(0));

    int n ;

    while (cin >> n) {

        matrix a(n),b(n),c(n);

        a.input();b.input();c.input();

        rand_m rd(n);rd.init_rand();

        rand_m l(n),r(n);l.init();r.init();

        rand_m tmp(n);tmp.init();

        multiply(rd, a,tmp);multiply(tmp, b,l);

       multiply(rd, c,r);

        bool fg =true;

        for (int i =0; i < n; i ++) {

            if(l.m[i] != r.m[i]) fg =false;

        }

        if(fg)printf("YES\n");

        elseprintf("NO\n");

   }

   

    return0;

}




原创粉丝点击