【BZOJ 2396】神奇的矩阵 矩阵+随机

本文介绍了一种利用矩阵乘法验证两个矩阵相乘是否等于第三个矩阵的算法。通过构造随机向量并利用矩阵乘法的结合律进行验证,适用于编程竞赛及算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实不要放过题目给出的每一个信息,就像这一道题,思考为什么一定是矩阵,为什么不是一个简单的数列之内的,说明解决这一道题就很用到矩阵的特殊性质。其中矩阵有一个性质就是A*B=C,C的行数等于A的行数,C的列数等于B的列数,所以我们完全可以随机构造一个n行1列的举证,然后利用矩阵乘法的结合律把矩阵变成n行1列的新矩阵,然后判断。

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 1010
#define REP(i,b) for(int i=1;i<=b;i++)
#include<cstdlib>
using namespace std;
int A[maxn][maxn],B[maxn][maxn],C[maxn][maxn],T,n;
int ans1[maxn],ans2[maxn],ans3[maxn],rad[maxn];
int read(){
	int x=0;char c=getchar();
	for(;c>'9'||c<'0';c=getchar());
	for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
	return x;
}

void mull(int a[maxn][maxn],int b[maxn],int s[maxn]){
	for(int i=1;i<=n;i++){
		s[i]=0;
		for(int k=1;k<=n;k++){
			s[i]+=a[i][k]*b[k];
		}
	}
}

int main(){
	while(scanf("%d",&n)!=EOF){
		srand(n*233);
		REP(i,n)rad[i]=rand();
		REP(i,n)REP(j,n)A[i][j]=read();
		REP(i,n)REP(j,n)B[i][j]=read();
		REP(i,n)REP(j,n)C[i][j]=read();
		
		mull(B,rad,ans1);
		mull(A,ans1,ans2);
		mull(C,rad,ans3);
		
		bool ok=false;
		for(int i=1;i<=n;i++){
			if(ans2[i]!=ans3[i]){ok=true;break;}
		}if(ok)puts("No");
		else puts("Yes");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值