提交时间:2025-02-08 10:03:29
运行 ID: 36175
/*C zhengjie*/ #include<bits/stdc++.h> #define int long long using namespace std; const int mod=998244353; int qpow(int a,int b) { if(b<0)return 0; int ret=1; while(b) { if(b&1)ret*=a,ret%=mod; a*=a,a%=mod,b>>=1; } return ret; } int ny(int chu) { return qpow(chu,mod-2); } int n,a=0,b=0,c=0,d=0; vector<int> v[200005],v2[200005]; void dfs(int p,int fa){ b+=(n-1)*qpow(2,n-2)%mod,b%=mod; c+=(n-v[p].size()-1)*qpow(2,n-3)%mod,c%=mod; for(int i=0;i<v[p].size();i++){ if(v[p][i]!=fa){ a+=(n-v[p].size()-v[v[p][i]].size())*qpow(2,n-4)%mod,a%=mod; d+=(n-2)*qpow(2,n-3)%mod,d%=mod; dfs(v[p][i],p); } } } signed main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n-1;i++){ int x,y; cin>>x>>y; v2[x].push_back(y); v2[y].push_back(x); } for(int i=1;i<=n-1;i++){ int x,y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } dfs(1,0); cout<<(a+b-c-d+mod+mod)%mod*ny(qpow(2,n))%mod; return 0; } //边*边=第二颗树所有去掉两个相邻点后的所有去点方案剩下的边之和 //点*点=第二颗树所有去掉一个点后的所有去点方案剩下的点之和 //- //点*边=第二颗树所有去掉一个点后的所有去点方案剩下的边之和 //边*点=第二颗树所有去掉两个相邻点后的所有去点方案剩下的点之和 //以上相加减后除以2^n