提交时间:2025-07-07 14:15:39

运行 ID: 38233

#include<bits/stdc++.h> #define ull unsigned long long using namespace std; const int N=2e5+10,base=131,mod=1e9+9; vector<int> E[N]; int f[N],g[N],h[N],par[N],rng[N],du[N],siz[N]; int n; mt19937_64 rd(9517); int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } int Hs(multiset<int> h){ int val=0,cnt=0; for(auto ed:h){ val=(val+1ll*qp(base,cnt)*ed+1ll*ed*ed)%mod; cnt++; }return val; } multiset<int> H[N]; void dfs(int u,int fa){ siz[u]=1;par[u]=fa; for(auto v:E[u]){ if(v==fa) continue; dfs(v,u); siz[u]+=siz[v]; H[u].insert(f[v]); }f[u]=(Hs(H[u])+rng[siz[u]])%mod; //cout<<u<<' '<<f[u]<<endl; }//get tree hash void dfs2(int u,int fa){ if(u==1){ h[u]=f[u]; }else{ H[u].insert(g[u]); h[u]=(Hs(H[u])+rng[siz[1]])%mod; } //h[u]=1ll*h[u]*f[u]%mod; //h[u]=1ll*rng[bk(u)]*h[u]%mod; for(auto v:E[u]){ if(v==fa) continue; //g[v]=1ll*(g[u]+1)*f[u]%mod; //g[v]=1ll*g[v]*qp(f[v]+1,mod-2)%mod; //cout<<v<<' '<<f[u]<<' '<<f[v]<<' '<<g[v]<<endl; //cout<<"H:"<<v<<' '<<g[v]<<endl; //rev(v); //int val=bk(v)+1; H[u].erase(H[u].find(f[v])); g[v]=(Hs(H[u])+rng[n-siz[v]])%mod; //cout<<v<<' '<<bk(u)<<' '<<g[v]<<endl; //h[v]=g[v]+1; //H[v].insert(bk(u)+1); H[u].insert(f[v]); dfs2(v,u); } } int main(){ cin>>n; for(int i=1;i<=n;i++) rng[i]=rd()%mod; for(int i=1;i<n;i++){ int u,v;cin>>u>>v; E[u].push_back(v); E[v].push_back(u); du[u]++;du[v]++; }dfs(1,0);dfs2(1,0); map<int,int> mp1; map<pair<int,int>,int> mp2; for(int i=1;i<=n;i++){ //f[i]=tmp[i]; //cout<<i<<' '<<f[i]<<' '<<g[i]<<' '<<h[i]<<endl; if(du[i]<4) mp1[h[i]]=1; if(!par[i]) continue; mp2[make_pair(f[i],g[i])]=1; mp2[make_pair(g[i],f[i])]=1; }cout<<mp1.size()<<' '<<mp1.size()+mp2.size()<<endl; return 0; }