其他分享
首页 > 其他分享> > 220722 T1 分树 (模拟)

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