给定一棵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