题意:给出n阶方阵A,B和C,判断C是否为A和B的乘积。
方阵规模最大为500×500,若直接将A和B相乘,算法复杂度为O(n^3),肯定要超时。考虑采用随机算法,随机选取50000个项进行测试。
用马甲测试了一下,一次AC:3216K 1594MS,大号提交WA了3次……
代码如下:
- #include <iostream>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- int A[500][500], B[500][500];
- long C[500][500];
- int main()
- {
- srand( (unsigned)time(NULL) );
- int k, j, n;
- int r, c;
- int sum, flag;
- cin >> n;
- for (k = 0; k < n; ++k)
- {
- for (j = 0; j < n; ++j)
- {
- scanf("%d", &A[k][j]);
- }
- }
- for (k = 0; k < n; ++k)
- {
- for (j = 0; j < n; ++j)
- {
- scanf("%d", &B[k][j]);
- }
- }
- for (k = 0; k < n; ++k)
- {
- for (j = 0; j < n; ++j)
- {
- scanf("%d", &C[k][j]);
- }
- }
- flag = 0;
- for (j = 0; j < 50000; ++j)
- {
- r = rand() % n;
- c = rand() % n;
- sum = 0;
- for (k = 0; k < n; ++k)
- {
- sum += A[r][k] * B[k][c];
- }
- if (sum != C[r][c])
- {
- flag = 1;
- break;
- }
- }
- if (flag == 0)
- {
- cout << "YES" << endl;
- }
- else
- {
- cout << "NO" << endl;
- }
- return 0;
- }