记录编号 613501 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [省选联考 2026] 找寻者 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 5.627 s
提交时间 2026-03-14 18:02:20 内存使用 73.02 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int N=5005;
const int mod=998244353;
typedef long long ll;
int c,t,n,dep[N],sz[N],L[N];
ll f[N][N],g[N][N],tmp[N],ans,inv[N],val[N];
vector<int>G[N];
void clear(){
	ans=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=sz[i];j++){
			f[i][j]=g[i][j]=0;
		}
		sz[i]=dep[i]=L[i]=0;
		G[i].clear();
	}
	return;
}
void add(int x,int y){
	G[x].push_back(y);
}
ll ksm(ll a,ll b){
	ll ans=1;
	while(b){
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1; 
	}
	return ans;
}
void dfs(int x,int fa){
	int son=0;
	dep[x]=1;
	for(auto y:G[x]){
		if(y==fa)continue;
		dfs(y,x);son++; 
		dep[x]=max(dep[x],dep[y]+1);
	}
	if(!son){
		sz[x]=1;
		f[x][1]=1;
	}else{
		g[x][0]=1,L[x]=0;
		for(auto y:G[x]){
			if(y==fa)continue;
			for(int i=0;i<=L[x];i++){
				for(int j=1;j<=dep[y];j++){
					(tmp[i+j]+=g[x][i]*f[y][j]%mod)%=mod;
				}
			}
			sz[x]+=sz[y];
			L[x]+=dep[y];
			for(int i=0;i<=L[x];i++){
				g[x][i]=tmp[i];
				tmp[i]=0;
			}
		}
		for(auto y:G[x]){
			if(y==fa)continue;
			int mx=-1;
			for(int i=dep[y];i>=1;i--){
				if(!f[y][i])continue;
				mx=i;break;
			}
			for(int i=0;i<=L[x];i++){
				tmp[i]=g[x][i];
			}
			if(mx!=-1){
				ll invf=ksm(f[y][mx],mod-2);
				for(int i=L[x];i>=mx;i--){
					if(!tmp[i])continue;
					ll inv=invf*tmp[i]%mod;
					val[i-mx]=inv;
					for(int j=0;j<=mx;j++){
						tmp[i-j]-=f[y][mx-j]*inv%mod;
						tmp[i-j]%=mod;
					}
				}
			}
			ll p=0,e=0;
			for(int i=1;i<=mx;i++){
				for(int j=0;j<=L[x]-mx;j++){
					(p+=val[j]*inv[i+j]%mod)%=mod;
				}
				p=(p*f[y][i]%mod*i)%mod;
				(f[x][i+1]+=p)%=mod;
				(e+=p)%=mod,p=0;
			}
			(ans+=(1-e)*sz[y]%mod)%=mod;
			for(int i=0;i<=L[x];i++)tmp[i]=val[i]=0;
		}
		sz[x]++;
	}
	return;
}
void work(){
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d %d",&u,&v);
		add(u,v),add(v,u);
	}
	dfs(1,0);
	ans=(ans%mod+mod)%mod;
	printf("%lld\n",ans);
	return;
}
int main(){
	freopen("recollector.in","r",stdin);
	freopen("recollector.out","w",stdout);
	scanf("%d %d",&c,&t);
	inv[0]=1;
	for(int i=1;i<=5000;i++)inv[i]=ksm(i,mod-2);
	while(t--){
		work();
		clear();
	}
	return 0;
}