[文章目录]
Description
给出三个行数和列数均为N的矩阵A、B、C,判断A*B=C是否成立。矩阵边长<=1000 多组数据
当前2017冬令营都没听过矩阵的时候乱搞A了这道题。蛇皮。把当时的代码交到BZOJ上再次AC。
正解应当是随机一个1*n的矩阵,然后由于矩阵有结合律,所以同时乘两边,时间复杂度变成了n^2,判断所得矩阵是否相同。
然而冬令营我直接求了一下c矩阵所有的元素的和,然后发现这个和通过AB矩阵用乘法结合律算出来的复杂度也是n^2,然后判断和是否相同就好了。
乱搞代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int t,n;
int a[1010][1010],b[1010][1010],c[1010][1010];
long long suma,sumb,sumc,sum;
void input()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[j][i]);
}
}
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]);
}
}
return ;
}
bool check()
{
for(int i=1;i<=n;i++)
{
suma=0;sumb=0;
for(int j=1;j<=n;j++)
{
suma+=a[i][j];
sumb+=b[i][j];
sumc+=c[i][j];
}
sum+=suma*sumb;
}
if(sumc==sum) return true;
else return false;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum=0;
sumc=0;
input();
if(check()) printf("Yes\n");
else printf("No\n");
}
return 0;
}