bzoj2396:神奇的矩阵

Pre

交不了,代码在这里。

有一个注意点。

Solution

随机一个矩阵与两边相乘。

Code

#include<bits/stdc++.h>
#define xx first
#define yy second
#define ll long long
using namespace std;

const int N = 1000 + 5, M = 1000;
int n;
bool flag;
struct Matrix1 {
	int info[N][N];
}a, b, c;
struct Matrix2 {
	int info[N];
	Matrix2 () {
		memset (info, 0, sizeof (info));
	}
}k;

inline void solve () {
	if (!flag) {
		return ;
	}
	for (int i = 1; i <= n; ++i) {
		k.info[i] = rand () % 100 + 1;
	}
	Matrix2 rr;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			rr.info[i] += c.info[i][j] * k.info[j];
		}
	}
	Matrix2 L, lst;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			L.info[i] += b.info[i][j] * k.info[j];
		}
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j) {
			lst.info[i] += a.info[i][j] * L.info[j];
		}
	}
	for (int i = 1; i <= n; ++i) {
		if (lst.info[i] != rr.info[i]) {
			flag = false;
			return ;
		}
	}
}

int main () {
	srand (19491001);
	while (scanf ("%d", &n) == 1) {
		flag = true;
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				scanf ("%d", &a.info[i][j]);
			}
		}
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				scanf ("%d", &b.info[i][j]);
			}
		}
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				scanf ("%d", &c.info[i][j]);
			}
		}
		solve ();
		solve ();
		solve ();
		if (flag) {
			printf ("Yes
");
		}
		else {
			printf ("No
");
		}
	}
	return 0;
}

Conclusion

注意,函数传入的不能是矩阵,不信自己试(炸空间)。

原文地址:https://www.cnblogs.com/ChiTongZ/p/11185517.html