• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
XD-TEST
博客园    首页    新随笔    联系   管理    订阅  订阅

bzoj4401 块的计数

  首先确定一个根后dfs一遍,统计出每个子树的点数个数,然后枚举n的因子x,统计多少子树的点数个数是当前枚举因子x的倍数,如果有n/x个子树满足条件,则答案+1

  代码

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<set>
 4 #define fi first
 5 #define sc second
 6 #define mp make_pair
 7 #define N 2000100
 8 using namespace std;
 9 int p[N],pre[N],tt[N],s[N],cnt[N];
10 int n,i,a,b,j,ans,dp,sum;
11 void link(int x,int y)
12 {
13     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
14 }
15 void dfs(int x,int fa)
16 {
17     int i=p[x];
18     s[x]=1;
19     while (i)
20     {
21         if (tt[i]!=fa)
22         {
23             dfs(tt[i],x);
24             s[x]+=s[tt[i]];
25         }
26         i=pre[i];
27     }
28 }
29 int main()
30 {
31     scanf("%d",&n);
32     for (i=1;i<n;i++)
33     {
34         scanf("%d%d",&a,&b); 
35         link(a,b);
36         link(b,a); 
37     }
38     dfs(1,0);
39     for (i=1;i<=n;i++)
40     cnt[s[i]]++;
41     for (i=1;i<=n;i++)
42     if (n%i==0)
43     {
44         sum=0;
45         for (j=i;j<=n;j+=i)
46         sum+=cnt[j];
47         if (sum==n/i) ans++;
48     }
49     printf("%d\n",ans);
50 } 

 

posted @ 2016-04-13 22:24  fzmh  阅读(212)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3