Justified Jungle

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章