題目鏈接:Justified Jungle
顯然可以割點邊數+1,一定是n的因子。
然後枚舉n的因子,比如當前 x+1是n的因子。
那麼割 x 條邊,剩下 (x+1) 個連通塊,且大小爲 n/(x+1) ,所以我們樹的子樹size爲 n/(x+1) 的個數一定要有x+1個。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10;
int n,sz[N],cnt[N];
vector<int> g[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
void dfs(int x,int fa) {
sz[x]=1;
for(auto to:g[x]) if(to!=fa) dfs(to,x),sz[x]+=sz[to];
cnt[sz[x]]++;
}
inline int check(int x) {
if(n%x) return 0;
int tmp=0,w=n/x;
for(int i=w; i<=n; i+=w) tmp+=cnt[i];
return tmp>=x;
}
signed main() {
cin>>n;
for(int i=1,a,b; i<n; i++) scanf("%d %d",&a,&b),add(a,b);
dfs(1,1);
for(int i=1; i<n; i++) if(check(i+1)) printf("%d ",i);
return 0;
}