给定一棵N个节点的无根树,现要求有多少种合法的分块方案。
 所谓合法的分块方案,就是将树分为若干个连通块,满足每个连通块内点数相同。
标签:gre 关系 read oid 连通 memory rip char discus
#include<bits/stdc++.h>
#define ll long long
const int maxn=1000005;
using namespace std;
int to[maxn*2],ne[maxn*2],hd[maxn];
int num,n,ans,k,siz[maxn],N[maxn];
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
inline int read(){
	int x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘;
	return x;
}
void dfs(int x,int fa){
	siz[x]=1;
	for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa) dfs(to[i],x),siz[x]+=siz[to[i]];
	N[siz[x]]++;
}
int main(){
	scanf("%d",&n); int uu,vv;
	for(int i=1;i<n;i++) uu=read(),vv=read(),add(uu,vv),add(vv,uu);
	dfs(1,-1);
	
	for(int i=1,now;i<=n;i++) if(!(n%i)){
		now=0;
		for(int j=i;j<=n;j+=i) now+=N[j];
		if(now*i==n) ans++;
	}
	
	printf("%d\n",ans);
	return 0;
}
标签:gre 关系 read oid 连通 memory rip char discus
原文地址:https://www.cnblogs.com/JYYHH/p/8947198.html