BZOJ-2396神奇的矩阵

[文章目录]

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;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注