I - Matrix God ( 矩阵乘法性质 )
题意:给一个数n,和三个矩阵a,b,c 长宽都为n。判断矩阵a*矩阵b是否等于矩阵c。
思路:由于矩阵乘法的复杂度为O(N^3);而部分验证又不能保证结果正确。我们巧妙地利用矩阵乘法的结合律:使其变为1*N和N*N的矩阵乘法,使复杂度降低为O(N^2); 即随机构造矩阵X(1*N),Y(N*1),那么问题成为验证X*A*B*Y==X*C*Y?然后利用结合律即可验证。
注意在构建X,Y时用rand随机构建,不能全设置为1。
for(i=1;i<=N;i++) r1[i]=rand()%Mod
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[1005][1005];
int b[1005][1005];
int c[1005][1005];
int A[1005];
int B[1005];
int r1[1005],r2[1005];
int n,x;
int ans;
const int mod = 1e9+7;
signed main()
{
cin >> n;
for ( int i=0; i<n; i++ ) {
for ( int j=0; j<n; j++ ) {
scanf("%lld",&a[i][j]);
}
r1[i] = rand()%mod;
r2[i] = rand()%mod;
}
for ( int i=0; i<n; i++ ) {
for ( int j=0; j<n; j++ ) {
scanf("%lld",&b[i][j]);
}
}
for ( int i=0; i<n; i++ ) {
for ( int j=0; j<n; j++ ) {
scanf("%lld",&c[i][j]);
}
}
for ( int j=0; j<n; j++ ) {
int sum = 0;
for ( int i=0; i<n; i++ ) {
sum += (a[i][j]*r1[i])%mod;
sum %= mod;
}
A[j] = sum;
}
for ( int i=0; i<n; i++ ) {
int sum = 0;
for ( int j=0; j<n; j++ ) {
sum += (b[i][j]*r2[j])%mod;
sum %= mod;
}
B[i] = sum;
}
int now = 0;
for ( int i=0; i<n; i++ ) {
now += (A[i]*B[i]);
now %= mod;
}
for ( int j=0; j<n; j++ ) {
int sum = 0;
for ( int i=0; i<n; i++ ) {
sum += (c[i][j]*r1[i])%mod;
sum %= mod;
}
A[j] = sum;
}
for ( int i=0; i<n; i++ ) {
ans += (A[i]*r2[i]);
ans %= mod;
}
if ( now==ans ) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}