这个为啥会T飞啊
  • 板块P7118 Galgame
  • 楼主azure_heir
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/4 23:06
  • 上次更新2023/11/4 11:58:31
查看原帖
这个为啥会T飞啊
113681
azure_heir楼主2021/8/4 23:06
#include<cstdio>
#include<cctype>
#include<algorithm>
#define int long long
using namespace std;
const int mod=998244353,N=1e6+5;
int a[N],b[N],f[N],fac[N<<1],inv[N<<1],ans=0,n,sz[N];
inline int read(){
	register int w=0;register char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)){
		w=(w<<1)+(w<<3)+(ch&15);
		ch=getchar();
	}
	return w;
}
inline void plus(int &x,int y){
	if (x+y>=mod) x=x+y-mod;
	else x=x+y;
}
inline int pow(int x,int y){
	register int ret=1;
	for (;y;y>>=1){
		if (y&1) ret=ret*x%mod;
		x=x*x%mod;
	}
	return ret;
}
inline int C(int x,int y){
	if (x<y||y<0) return 0;
	return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
inline void Init(int x){
	fac[0]=1;
	for (register int i=1;i<=x;++i) fac[i]=fac[i-1]*i%mod;
	inv[x]=pow(fac[x],mod-2);
	for (register int i=x-1;~i;--i) inv[i]=inv[i+1]*(i+1)%mod;
	f[0]=1;
	for (register int i=1;i<=n;++i) f[i]=(C(i<<1,i)-C(i<<1,i-1)+mod)%mod;
}
inline void getsize(int u){
	sz[u]=1;
	if (a[u]) getsize(a[u]);
	if (b[u]) getsize(b[u]);
	sz[u]+=sz[a[u]]+sz[b[u]];
}
inline void getans(int u,int w){
	for (register int i=0;i<sz[a[u]];++i) plus(ans,w*f[i]%mod*f[sz[u]-i-1]%mod);
	if (a[u]) getans(a[u],w*f[sz[b[u]]]%mod);
	if (b[u]) getans(b[u],w);
}
signed main(){
	n=read();
	for (register int i=1;i<=n;++i) a[i]=read(),b[i]=read();
	Init(n<<1);
	for (register int i=1;i<n;++i) plus(ans,f[i]);
	getsize(1);getans(1,1);
	printf("%lld\n",ans);
	return 0;
}
2021/8/4 23:06
加载中...