题意:给你A,B,C三个矩阵,问A*B==C? n^3会超时。
思路:玄学题?计算C矩阵中一个点的值的复杂度为O(N),所以我们随机一个C矩阵中的点,然后计算该位置的值,如果和C矩阵不一样,那么证明不等。多进行几次,正确率会随着计算次数的增加而增加。N=500,那么最多进行1e6次左右,挑一个比较大点的数字,挑选一个吉利数字进行尝试,多交几发就过了。
同类型的题POJ2454
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int MAXN = 505;
int n, A[MAXN][MAXN], B[MAXN][MAXN], C[MAXN][MAXN];
bool judge()
{
srand((unsigned)time(NULL));
for (int num = 0; num < 66666; num++)
{
int t = 0, i = rand()%n + 1, j = rand()%n + 1;//1~n的数字
for (int k = 1; k <= n; k++)
{
t += A[i][k] * B[k][j];
}
if (t != C[i][j]) return false;
}
return true;
}
int main()
{
while (~scanf("%d", &n))
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &A[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &B[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &C[i][j]);
if (judge()) printf("YES\n");
else printf("NO\n");
}
return 0;
}
/*
2
1 0
2 3
5 1
0 8
5 1
10 26
*/