51NOD 1140 矩阵相乘结果的判断(随机化算法+矩阵结合率)

传送门
给出三个N*N的矩阵A, B, C,问A * B是否等于C?
Input
第1行,1个数N。(0 <= N <= 500)
第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16)
第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16)
第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。
Output
如果相等输出Yes,否则输出No。
Input示例
2
1 0
0 1
0 1
1 0
0 1
1 0
Output示例
Yes

解题思路:
正常我们计算矩阵乘法的时候复杂度 O(n3) ,在本题中如果是这样算的话肯定会超时,所以我们就构造一个 1n 的矩阵,在 AB=C 的左边分别乘以这个 1n 的矩阵,然后就将算法的复杂度降下来了,然后就为 O(n2) ,然后就想办法构造这样的一个矩阵,所以就考虑到了随机化算法,然后随机一个 1n 的矩阵,作为计算,最后判断就行了,然后这样写完之后莫名奇妙的超时了,结果换了 VisualC++ 之后就过了,后来又将原先的代码加了输入外挂,然后在 C++ 里面就过了。

My Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 502;
int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN], rnd[MAXN], sum1[MAXN], sum2[MAXN], sum3[MAXN];
int Scan()///输入外挂
{
    int res=0,ch,flag=0;
    if((ch=getchar())=='-') flag=1;
    else if(ch>='0'&&ch<='9')
        res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+ch-'0';
    return flag?-res:res;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) a[i][j] = Scan();
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) b[i][j] = Scan();
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) c[i][j] = Scan();
    for(int i=0; i<n; i++) rnd[i] = rand()%17;
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum1[i] += a[j][i]*rnd[j];
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum2[i] += b[j][i]*sum1[j];
    for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum3[i] += c[j][i]*rnd[j];
    int ok = 1;
    for(int i=0; i<n; i++) if(sum3[i] != sum2[i]) {ok = 0; break;}
    if(ok)  puts("Yes");
    else    puts("No");
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值