救救孩子吧……调了半天了
查看原帖
救救孩子吧……调了半天了
157857
ImmortalWatcher楼主2020/8/7 21:02

50分WA……

#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int mo=998244353;
struct node{int en,next;} e[2000001];
int T,n,m,x,y,tot=1,top,stk[500001],f[500001],g[500001],stke[500001],last[2000001];
bool bz[2000001],bz2[500001];
void add(int x,int y)
{
	e[++tot].en=y;
	e[tot].next=last[x];
	last[x]=tot;
}
bool pd(int x,int fa)
{
	stk[x]=top;bz2[x]=true;
	for (int i=last[x];i;i=e[i].next)
		if (e[i].en!=fa&&!bz[i])
		{
			if (bz2[e[i].en])
			{
				bz[i]=bz[i^1]=true;
				for (int j=stk[e[i].en]+1;j<=stk[x];j++)
				{
					if (bz[stke[j]]) return false;
					bz[stke[j]]=bz[stke[j]^1]=true;
				}
				continue;
			}
			stke[++top]=i;
			if (!pd(e[i].en,x)) return false;
		}
	--top;
	return true;
}
void dg(int x,int fa)
{
	f[x]=1;bz2[x]=true;
	int sum=0;
	for (int i=last[x];i;i=e[i].next)
		if (e[i].en!=fa&&!bz[i])
		{
			dg(e[i].en,x);
			f[x]=f[x]*f[e[i].en]%mo;
			sum++;
		}
	if (!fa) f[x]=f[x]*g[sum]%mo;
	else f[x]=f[x]*g[sum+1]%mo;
}
int calc()
{
	if (!pd(1,0)) return 0;
	for (int i=1;i<=n;i++) bz2[i]=false;
	int ans=1;
	for (int i=1;i<=n;i++)
		if (!bz2[i]) dg(i,0),ans=ans*f[i]%mo;
	return ans;
}
signed main()
{
	scanf("%lld",&T);
	g[0]=g[1]=1;
	for (int i=2;i<=500000;i++)
		g[i]=g[i-1]+g[i-2]*(i-1);
	while (T--)
	{
		scanf("%lld%lld",&n,&m);
		tot=1;top=0;
		for (int i=1;i<=n;i++) bz2[i]=false,last[i]=0;
		for (int i=1;i<=m;i++)
			scanf("%lld%lld",&x,&y),add(x,y),add(y,x);
		for (int i=2;i<=tot;i++) bz[i]=false;
		printf("%lld\n",calc());
	} 
	return 0;
}
2020/8/7 21:02
加载中...