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