QOJ.ac

QOJ

IDSubmission IDProblemHackerOwnerResultSubmit timeJudge time
#1562#893729#9278. Linear Algebra IntensifieshxhhxhHanghangFailed.2025-02-18 17:43:432025-02-18 17:43:43

Details

Extra Test:

Invalid Input

input:

60931 77317
1 2
2 2
1 3
2 3
3 3
1 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31
32 32
33 33
34 34
35 35
36 36
37 37
38 38
39 39
40 40
41 41
42 42
43 43
44 44
45 45
46 46
47 47
48 48
49 49
50 5...

output:


result:

FAIL m - n > 300

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#893729#9278. Linear Algebra IntensifiesHanghangWA 824ms102132kbC++201.8kb2025-02-10 21:31:392025-02-18 19:15:43

answer

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=5e5+3,M=605,H=998244353;
ll n,m,tot,pos[N],fa[N],f[M][M];
queue<int>q;
bool vis[N];
map<int,array<ll,2>>mp[N];
void Add(ll &x,ll y){x=(x+y)%H;}
int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
void Mer(int x,int y){if(F(x)!=F(y))fa[F(x)]=F(y);}
ll Inv(ll x){return x<=1?x:H-H/x*Inv(H%x)%H;}
void Upd(int x){if(mp[x].size()<=2&&!vis[x])q.push(x),vis[x]=1;}
void Mdf(int x,int y,array<ll,2> A)
{
	if(!mp[x].count(y)){mp[x][y]=mp[y][x]=A;return;}
	array<ll,2> B=mp[x][y];
	mp[x][y]=mp[y][x]={A[0]*B[0]%H,(A[0]*B[1]+A[1]*B[0])%H}; 
}
void Link(int x,int y,ll d)
{
	Add(f[x][x],d);Add(f[y][y],d);
	Add(f[x][y],H-d);Add(f[y][x],H-d);
}
ll Det()
{
	ll s=1;tot--;
	for(int i=1;i<=tot;i++)
	{
		int z=i;
		while(z<=tot&&!f[z][i])z++;
		if(z>tot)return 0;
		if(z>i)swap(f[z],f[i]),s=H-s;
		ll v=Inv(f[i][i]);s=s*f[i][i]%H; 
		for(int j=2;j<=tot;j++)if(j!=i)
		{
			ll d=f[j][i]*v%H;
			for(int k=i+1;k<=tot;k++)Add(f[j][k],H-f[i][k]*d%H);
		}
	}
	return s;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;n++;iota(fa+1,fa+n+1,1);ll res=1;
	for(int i=1,l,r;i<=m;i++)cin>>l>>r,r++,Mdf(l,r,{1,1}),Mer(l,r);
	for(int i=1;i<=n;i++)if(F(i)!=F(1)){cout<<0;return 0;}
	for(int i=1;i<=n;i++)Upd(i);
	while(q.size())
	{
		int x=q.front();q.pop();
		if(mp[x].size()==1)res=res*(mp[x].begin()->second)[1]%H;
		if(mp[x].size()==2)
		{
			auto [u,A]=*mp[x].begin();
			auto [v,B]=*mp[x].rbegin();
			Mdf(u,v,{(A[0]*B[1]+A[1]*B[0])%H,A[1]*B[1]%H});
		}
		for(auto [u,A]:mp[x])mp[u].erase(x),Upd(u);
	}
	for(int i=1;i<=n;i++)if(!vis[i])pos[i]=++tot;
	for(int u=1;u<=n;u++)if(!vis[u])for(auto [v,A]:mp[u])if(u<v)
		res=res*A[0]%H,Link(pos[u],pos[v],A[1]*Inv(A[0])%H); 
	cout<<res*Det()%H;
}