题解:P16355 「Diligent-OI R3 C」彼方へ、名もなき海辺より
下文提到的
我们来思考一下什么情况下会产生
对于一个节点
好的,题目转化成了每一个点出度都为
然后转移公式就推出来了:
然后将
总可能数计算方式:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353,N=5e5+5;
int n,sum=1,ans,u,v,cnt[N],dp[N];
vector<int> edge[N];
int qpow(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
void dfs(int now,int fa,int k){
(sum*=(k+edge[now].size()-(fa>0)))%=mod;
cnt[now]=k+edge[now].size()-(fa>0);
for(auto to:edge[now]) if(to!=fa) dfs(to,now,k+1);
}
void dfss(int now,int fa){
if(fa) dp[now]=qpow(cnt[now],mod-2)%mod*(qpow(cnt[fa],mod-2)+dp[fa])%mod;
for(auto to:edge[now]) if(to!=fa) dfss(to,now);
}
signed main(){
cin>>n;
for(int i = 1;i<n;i++)
cin>>u>>v,
edge[u].push_back(v),
edge[v].push_back(u);
dfs(1,0,0);
dfss(1,0);
for(int i = 1;i<=n;i++) (ans+=dp[i])%=mod;
cout<<ans*sum%mod;
return 0;
}