A mul B Problem (KUPC 2012 Practice)

http://kupc2012pr.contest.atcoder.jp/tasks/kupc2012pr_4#

問題

解法

ヒントに書いてある通り。1000*1000だったので普通の行列乗算でも通ってしまった。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <assert.h>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <set>

using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
static const double EPS = 1e-9;
static const double PI = acos(-1.0);

#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define FOR(i, s, n) for (int i = (s); i < (int)(n); i++)
#define FOREQ(i, s, n) for (int i = (s); i <= (int)(n); i++)
#define FORIT(it, c) for (__typeof((c).begin())it = (c).begin(); it != (c).end(); it++)
#define MEMSET(v, h) memset((v), h, sizeof(v))

int n;
int a[1010][1010];
int b[1010][1010];
int c[1010][1010];
int vect1[1010];
int vect2[1010];
int temp1[1010];
int temp2[1010][1010];

void PrintMat(int mat[1010][1010]) {
  REP(y, n) {
    REP(x, n) {
      printf("%d ", mat[y][x]);
    }
    puts("");
  }
  puts("");
}

void Mul(int mat1[1010][1010], int mat2[1010][1010]) {
  MEMSET(temp2, 0);
  REP(y, n) {
    REP(x, n) {
      REP(i, n) {
        temp2[y][x] += mat1[y][i] * mat2[i][x];
      }
    }
  }
  memcpy(mat1, temp2, sizeof(temp2));
}

void Mul(int mat[1010][1010], int v[1010]) {
  MEMSET(temp1, 0);
  REP(y, n) {
    REP(x, n) {
      temp1[y] += mat[y][x] * v[x];
    }
  }
  memcpy(v, temp1, sizeof(temp1));
}

void LoadMat(int mat[1010][1010]) {
  REP(y, n) {
    REP(x, n) {
      int v = scanf("%d", &mat[y][x]);
      assert(v == 1);
    }
  }
}

int main() {
  while (scanf("%d", &n) > 0) {
    LoadMat(a);
    LoadMat(b);
    LoadMat(c);
    bool ok = true;
    REP(iter, 100) {
      REP(i, n) { vect1[i] = vect2[i] = rand() % 2; }
      Mul(b, vect1);
      Mul(a, vect1);
      Mul(c, vect2);
      REP(i, n) {
        if (vect1[i] != vect2[i]) { ok = false; break; }
      }
    }
    puts(ok ? "YES" : "NO");
  }
}