【DFS+思維】 GYM101620J Justified Jungle
阿新 • • 發佈:2018-12-20
#include <bits/stdc++.h> using namespace std; set <int> s; int head[1000005],to[2000005],nxt[2000005],Size[1000005],num[1000005]; int tot,n; void addedge(int u,int v) { to[++tot]=v; nxt[tot]=head[u]; head[u]=tot; } void dfs(int u,int fa) { Size[u]=1; for(int i=head[u];i!=-1;i=nxt[i]) { int v=to[i]; if(v==fa) continue; dfs(v,u); Size[u]+=Size[v]; } num[Size[u]]++; } int ok(int x) { int ans=0; for(int i=x;i<=n;i+=x) { ans+=num[i]; } return ans; } int main() { memset(head,-1,sizeof(head)); scanf("%d",&n); tot=0; for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } dfs(1,0); // int k=sqrt(n); for(int i=1;i*i<=n;i++) { if(n%i==0) { int q=ok(i); if(q==n/i) { s.insert(q-1); } if(i*i!=n&&i!=1) { q=ok(n/i); if(q==i) s.insert(q-1); } } } for(set<int>::iterator it = s.begin(); it != s.end(); ++it) { int p = *it; printf("%d ",p); } printf("\n"); return 0; }