poj3318

题意:给定三个矩阵a,b,c,问a×b是否等于c?

分析:只需要设置一个列向量x,求a*(b*x),求c*x,看是否相等即可。

当然这不能保证正确,x是生成的随机向量,多次生成多次测试即可使错误概率大大减小。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;

const int maxn = 510;

long long  a[maxn][maxn], b[maxn][maxn], c[maxn][maxn], x[maxn];
int n;

void init(long long m[maxn][maxn])
{
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			scanf("%I64d", &m[i][j]);
}

void mul(long long m[maxn][maxn], long long x[maxn], long long ans[maxn])
{
	for (int i = 0; i < n; i++)
	{
		ans[i] = 0;
		for (int j = 0; j < n; j++)
			ans[i] += x[j] * m[i][j];
	}
}

bool check(long long ans1[maxn], long long ans2[maxn])
{
	for (int i = 0; i < n; i++)
		if (ans1[i] != ans2[i])
			return false;
	return true;
}
int main()
{
	//freopen("D:\\t.txt", "r", stdin);
	scanf("%d", &n);
	init(a);
	init(b);
	init(c);
	int t = 10;
	while (t--)
	{
		srand(time(NULL));
		for (int i = 0; i < n; i++)
			x[i] = rand()%1000 + 1;
		long long ans[maxn], ans1[maxn], ans2[maxn];
		mul(b, x, ans);
		mul(a, ans, ans1);
		mul(c, x, ans2);
		if (!check(ans1, ans2))
		{
			printf("NO\n");
			return 0;
		}
	}
	printf("YES\n");
	return 0;
}

posted @ 2011-02-01 12:45  金海峰  阅读(706)  评论(0编辑  收藏  举报