Luogu P10102 [GDKOI2023 提高组] 矩阵 题解

P10102 [GDKOI2023 提高组] 矩阵

模拟赛题,场切了,似乎做法和全世界都不一样。

直接暴力矩阵乘法显然过不去,也没有什么前途。注意到只需要判定是否相等,考虑矩阵每一行的和。假设现在正在计算第 i 项的和。

j=1nk=1nAi,kBk,j

交换枚举顺序,不难得到如下式子。

k=1nAi,kj=1nBk,j

我们发现,j=1nBk,j 其实就是 B 中第 k 行的数的和,预处理之后每一行就只需要枚举 k 就可以计算。总时间复杂度就达到了 O(n2)

我们判断算出来每行的和与 C 中每行的和是否相等即可。但是由于取模,有可能会出现冲突,所以我们再把每一列都判断一下。可以类比哈希,这么做出错概率极低。

#include <bits/stdc++.h>
using namespace std;
long long t,n,a[3001][3001],b[3001][3001],c[3001][3001],ha[3001],hb[3001],hc[3001],la[3001],lb[3001],lc[3001];
const long long mod=998244353;
inline long long read()
{
	long long x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	n=read();
	   	for(int i=1;i<=n;i++)ha[i]=hb[i]=hc[i]=la[i]=lb[i]=lc[i]=0;
	   	for(int i=1;i<=n;i++)
	   	    for(int j=1;j<=n;j++)
	   	        a[i][j]=read(),ha[i]=(ha[i]+a[i][j])%mod,la[j]=(la[j]+a[i][j])%mod;
	   	for(int i=1;i<=n;i++)
	   	    for(int j=1;j<=n;j++)
	   	        b[i][j]=read(),hb[i]=(hb[i]+b[i][j])%mod,lb[j]=(lb[j]+b[i][j])%mod;
	   	for(int i=1;i<=n;i++)
	   	    for(int j=1;j<=n;j++)
	   	        c[i][j]=read(),hc[i]=(hc[i]+c[i][j])%mod,lc[j]=(lc[j]+c[i][j])%mod;
	   	bool flag=0;
	    for(int i=1;i<=n;i++)
	        {
	        long long sum=0;
	        for(int k=1;k<=n;k++)sum=(sum+a[i][k]*hb[k]%mod)%mod;
	        if(sum!=hc[i])
	           {
	           	flag=1;
	           	break;
			   }
	        }
	    if(!flag)
	       for(int i=1;i<=n;i++)
	        {
	        long long sum=0;
	        for(int k=1;k<=n;k++)sum=(sum+b[k][i]*la[k]%mod)%mod;
	        if(sum!=lc[i])
	           {
	           	flag=1;
	           	break;
			   }
	        }
	    if(flag)printf("No\n");
	    else printf("Yes\n");
	   }
	return 0;
}
posted @   w9095  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示