求调行列式
查看原帖
求调行列式
101694
yummyeaten楼主2022/5/2 20:00

RT,60 pts,目前的情况是无法正确判断行列式的正负(也就是大多时候答案正确但剩下的时候输出答案的相反数)

#include<bits/stdc++.h>
using namespace std;
const int Mod=998244353;
long long fpw(long long x,int y)
{
	long long res=1,cur=x;
	for(int i=1;i<=y;i<<=1)
	{
		if(y&i)res=res*cur%Mod;
		cur=cur*cur%Mod;
	}
	return res;
}
struct matrix
{
	int r,c;
	long long a[205][205];
	void mat0(int R,int C){r=R;c=C;memset(a,0,sizeof(a));}
	void print(char format[])
	{
		for(int i=1;i<=r;i++)
		{
			for(int j=1;j<=c;j++)
				printf(format,a[i][j]);
			puts("");
		}
	}
	long long Gauss() // return value is det A
	{
		long long fenmu=1;
		int n=r;
		for(int k=1;k<=n;k++)
		{
			bool fnd=0;
			for(int i=k;i<=n;i++)
			{
				for(int j=k;j<=n;j++)
					if(a[i][j]!=0)
					{
						for(int t=k;t<=n;t++)swap(a[k][t],a[i][t]);
						for(int t=k;t<=n;t++)swap(a[t][k],a[t][j]);
						if((i+j)%2)fenmu*=-1;
						fnd=1;break;
					}
				if(fnd)break;
			}
			for(int i=k+1;i<=n;i++)
			{
				fenmu=fenmu*a[k][k]%Mod;
				for(int j=n;j>=k;j--)
					a[i][j]=(a[i][j]*a[k][k]-a[k][j]*a[i][k])%Mod;
			}
		}
		fenmu=fpw(fenmu,Mod-2);
		for(int i=1;i<=n;i++)fenmu=fenmu*a[i][i]%Mod;
		return fenmu<0?fenmu+Mod:fenmu;
	}
};
matrix operator * (matrix x,matrix y)
{
	assert(x.c==y.r);
	matrix ans;
	ans.mat0(x.r,y.c);
	ans.r=x.r;ans.c=y.c;
	for(int i=1;i<=x.r;i++)
		for(int j=1;j<=x.c;j++)
			for(int k=1;k<=y.c;k++)
				ans.a[i][k]=(x.a[i][j]*y.a[j][k]+ans.a[i][k])%Mod;
	return ans;
}
int T,k,n[105],m[105];
matrix a[105];
int main()
{
	freopen("P7736_1.in","r",stdin);
	int u,v;
	for(scanf("%d",&T);T;T--)
	{
		scanf("%d",&k);
		//cout<<"k="<<k<<endl;
		for(int i=1;i<=k;i++)
			scanf("%d",&n[i]);
		for(int i=1;i<k;i++)
			scanf("%d",&m[i]);
		//puts("hello");
		for(int i=1;i<k;i++)
		{
			a[i].r=n[i];
			a[i].c=n[i+1];
			memset(a[i].a,0,sizeof a[i]);
			for(int t=1;t<=m[i];t++)
			{
				scanf("%d%d",&u,&v);
				a[i].a[u][v]=1;
			}
			//puts("hi");
		}
		//a[1].print("%3d");
		//a[2].print("%3d");
		for(int i=2;i<k;i++)
			a[i]=a[i-1]*a[i];
		a[k-1].print("%3d");
		printf("%lld\n",a[k-1].Gauss());
	}
	return 0;
}
2022/5/2 20:00
加载中...