Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35982 | 22fhq | 【S】T3 | C++ | 解答错误 | 0 | 141 MS | 33460 KB | 2592 | 2025-02-07 13:36:21 |
#include<bits/stdc++.h> #define int long long using namespace std; void read(int &x){ x=0; char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))x=x*10+(c^48),c=getchar(); return; } const int mod=998244353; int n; vector<int>et[200005],eu[200005]; int del; bool vist[100],visu[100]; int qp(int x,int y){ int res=1; while(y){ if(y&1)res*=x,res%=mod; x*=x,x%=mod; y>>=1; } return res; } void dfst(int p,int f){ vist[p]=1; for(int x:et[p]){ if(x==f)continue; if((del>>(x-1)&1)==0)continue; dfst(x,p); } } void dfsu(int p,int f){ visu[p]=1; for(int x:eu[p]){ if(x==f)continue; if((del>>(x-1)&1)==1)continue; dfsu(x,p); } } int calc(){ int x=0,y=0; for(int i=1;i<=n;i++){ if((del>>(i-1)&1)==0)continue; if(vist[i])continue; x++; dfst(i,0); } for(int i=1;i<=n;i++){ if((del>>(i-1)&1)==1)continue; if(visu[i])continue; y++; dfsu(i,0); } return x*y; } void slv1(){ int ans=0; for(del=0;del<(1<<n);del++){ for(int i=1;i<=n;i++)vist[i]=visu[i]=0; ans+=calc(); ans%=mod; } cout<<(ans*qp(qp(2,n),mod-2))%mod<<endl; return; } int sumx[200005][2],sumy[200005][2],sumxy[200005][2]; void slv2(){ sumx[1][0]=0,sumx[1][1]=1; sumy[1][0]=1,sumy[1][1]=0; sumxy[1][0]=sumxy[1][1]=0; for(int i=2;i<=n;i++){ sumx[i][0]=sumx[i-1][0]+sumx[i-1][1]; sumy[i][1]=sumy[i-1][0]+sumy[i-1][1]; sumx[i][1]=sumx[i-1][0]+sumx[i-1][1]+qp(2,i-2); sumy[i][0]=sumy[i-1][0]+sumy[i-1][1]+qp(2,i-2); sumxy[i][0]=sumxy[i-1][0]+sumxy[i-1][1]+sumx[i-1][1]; sumxy[i][1]=sumxy[i-1][0]+sumxy[i-1][1]+sumy[i-1][0]; sumx[i][0]%=mod; sumx[i][1]%=mod; sumy[i][0]%=mod; sumy[i][1]%=mod; sumxy[i][0]%=mod; sumxy[i][1]%=mod; } cout<<(((sumxy[n][0]+sumxy[n][1])%mod)*qp(qp(2,n),mod-2))%mod<<endl; } signed main(){ read(n); for(int i=1;i<n;i++){ int u,v; read(u),read(v); et[u].push_back(v); et[v].push_back(u); } for(int i=1;i<n;i++){ int u,v; read(u),read(v); eu[u].push_back(v); eu[v].push_back(u); } slv2(); // if(n<=20){ // slv1(); // return 0; // } // else{ // slv2(); // return 0; // } return 0; }