一点小问题
查看原帖
一点小问题
537046
大眼仔Happy楼主2024/1/29 15:53

rt,为啥前面这个 TLE 了,后面这个 AC 了,只把 mul 脱掉了放出来,却快了超级多。?!

#include<bits/stdc++.h>
using namespace std;
const int N=3005,mod=998244353;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int T,n;
struct Vector{int G[N];void clear(){memset(G,0,sizeof(G));}}d,res1,res2;
struct Matrix
{
	int G[N][N];
	void get(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)G[i][j]=read();}
}A,B,C;
Vector mul(Vector V,Matrix M)
{
	Vector res;res.clear();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			res.G[i]=(res.G[i]+1ll*V.G[j]*M.G[j][i])%mod;
	return res;
}
bool RandomJudge()
{
	for(int i=1;i<=n;i++)d.G[i]=rand();
	res1=mul(d,A);res1=mul(res1,B);res2=mul(d,C);
	for(int i=1;i<=n;i++)if(res1.G[i]!=res2.G[i])return false;
	return true;
}
void solve()
{
	n=read();A.get();B.get();C.get();
	if(RandomJudge())return printf("Yes\n"),void();
	printf("No\n");
}
int main(){
	srand(time(0));
	T=read();while(T--)solve();
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=3005,mod=998244353;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int T,n;
struct Vector{int G[N];void clear(){memset(G,0,sizeof(G));}}d,res1,res2,res3;
struct Matrix
{
	int G[N][N];
	void get(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)G[i][j]=read();}
}A,B,C;
bool RandomJudge()
{
	for(int i=1;i<=n;i++)d.G[i]=rand();
	
	res1.clear();res2.clear();res3.clear();
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			res1.G[i]=(res1.G[i]+1ll*d.G[j]*A.G[j][i])%mod;
			
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			res2.G[i]=(res2.G[i]+1ll*res1.G[j]*B.G[j][i])%mod;
			
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			res3.G[i]=(res3.G[i]+1ll*d.G[j]*C.G[j][i])%mod;
			
	for(int i=1;i<=n;i++)if(res2.G[i]!=res3.G[i])return false;
	return true;
}
void solve()
{
	n=read();A.get();B.get();C.get();
	if(RandomJudge())return printf("Yes\n"),void();
	printf("No\n");
}
int main(){
	srand(time(0));
	T=read();while(T--)solve();
	return 0;
}
2024/1/29 15:53
加载中...