220722 T1 分树 (模拟)
作者:互联网
dfs一遍求出以每个节点为根的子树大小,然后枚举n的约数,对于每个约数i,统计sz[ ]是i的倍数的有多少个(开桶统计),如果有n/i个则答案+1。
这道题也就是个结论题,画图分析一下。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e6+10; 4 int head[N],to[N],nxt[N],tot; 5 void add(int u,int v){ 6 nxt[++tot]=head[u]; 7 head[u]=tot; 8 to[tot]=v; 9 } 10 int n,ans,sz[N],t[N];//t[]是桶 11 12 void dfs(int u,int f){ 13 sz[u]=1; 14 for(int i=head[u];i;i=nxt[i]){ 15 int v=to[i]; 16 if(v==f) continue; 17 dfs(v,u); 18 sz[u]+=sz[v]; 19 } 20 t[sz[u]]++; 21 } 22 23 int main(){ 24 scanf("%d",&n); 25 for(int i=1;i<n;i++){ 26 int u,v;scanf("%d%d",&u,&v); 27 add(u,v),add(v,u); 28 } 29 dfs(1,0); 30 for(int i=1;i<=n;i++){ 31 if(n%i==0){ 32 int s=0; 33 for(int j=1;j<=n/i;j++) //枚举倍数 34 s+=t[i*j]; 35 ans+=(s==n/i); 36 } 37 } 38 cout<<ans<<endl; 39 return 0; 40 }
标签:分树,head,nxt,220722,sz,int,tot,T1,dfs 来源: https://www.cnblogs.com/yhxnoerror/p/16505626.html