提交时间:2025-05-08 19:39:02

运行 ID: 37768

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; typedef long double db; const int maxn=1e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,p[maxn],q[maxn],C[105][105]; vector<int>E[maxn]; int qp(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } typedef vector<int> poly; poly add(poly a,poly b){ poly c(max(a.size(),b.size()),0); up(i,0,(int)a.size()-1)c[i]=a[i]; up(i,0,(int)b.size()-1)(c[i]+=b[i])%=mod; return c; } poly sub(poly a,poly b){ for(int &x:b)x=mod-(x?x:mod); return add(a,b); } int gt(poly a,int x){ int res=0; down(i,(int)a.size()-1,0)res=(res*1ll*x%mod+a[i])%mod; return res; } struct _ { poly P[10]; _(){up(i,0,9)P[i].clear();} }; poly conv(poly a,poly b){ if(a.empty()||b.empty())return {}; int n=a.size()-1,m=b.size()-1; poly c(n+m+1,0); up(i,0,n)up(j,0,m)(c[i+j]+=a[i]*1ll*b[j]%mod)%mod; return c; } poly JiFen(poly a){ poly b((int)a.size()+1); up(i,0,(int)a.size()-1)b[i+1]=a[i]*1ll*qp(i+1,mod-2)%mod; return b; } _ conv(_ a,_ b){ _ c; up(i,0,9)c.P[i]=conv(a.P[i],b.P[i]); return c; } _ gmin(_ a,int k){ up(i,k,9)a.P[i]={1}; return a; } _ mul(_ a,int k){ int iv=qp(k,mod-2); _ b; up(i,0,9){ int M=1; up(j,0,(int)a.P[i].size()-1)a.P[i][j]=a.P[i][j]*1ll*M%mod,M=M*1ll*iv%mod; up(j,i*k,min((i+1)*k-1,9))b.P[j]=a.P[i]; } return b; } poly get(poly a,int k){k=mod-k; poly b(a.size(),0); up(i,0,(int)a.size()-1){ down(j,i,0){ (b[j]+=a[i]*1ll*qp(k,i-j)%mod*1ll*C[i][j]%mod)%=mod; } } return b; } _ add(_ a,int l,int r){ _ b; int iv=qp(r-l,mod-2); auto S=[&](int p,int k){ if(p<0)return (poly){}; return get(JiFen(a.P[p]),k); }; up(i,l,9){ b.P[i]=sub(S(i-l,l),S(i-r,r)); for(int &x:b.P[i])x=x*1ll*iv%mod; } return b; } _ dfs(int u,int fa){ _ res;up(i,0,9)res.P[i]={1}; for(int x:E[u])if(x!=fa)res=conv(res,dfs(x,u)); if(p[u]>=0)res=add(res,p[u],q[u]); else if(p[u]==-1)res=mul(res,q[u]); else res=gmin(res,q[u]); return res; } void slv(){ n=read();C[0][0]=1; up(i,1,n){ C[i][0]=1;up(j,1,i)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } up(i,1,n)E[i].clear(); up(i,1,n)p[i]=read(),q[i]=read(); up(i,1,n-1){ int x=read(),y=read(); E[x].p_b(y),E[y].p_b(x); } _ ans=dfs(1,0); int res=0; up(i,0,9){ poly k=ans.P[i]; for(int &x:k)x=mod-(x?x:mod); if(k.empty())k.resize(1,0); (k[0]+=1)%=mod; k=JiFen(k); (res+=(gt(k,i+1)-gt(k,i)+mod)%mod)%=mod; } printf("%d\n",res); } int main(){ //freopen("performant.in","r",stdin),freopen("performant.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin),fclose(stdout); return 0; }