zoukankan      html  css  js  c++  java
  • BZOJ4401 块的计数

    Description

    小Y最近从同学那里听说了一个十分牛B的高级数据结构——块 状树。听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效。当然,无聊的小Y对这种事情毫无兴趣,只是对把树分块这个操作感到十 分好奇。他想,假如能把一棵树分成几块,使得每个块中的点数都相同该有多优美啊!小Y很想知道,能有几种分割方法使得一棵树变得优美。小Y每次会画出一棵 树,但由于手速太快,有时候小Y画出来的树会异常地庞大,令小Y感到十分的苦恼。但是小Y实在是太想知道答案了,于是他找到了你,一个天才的程序员,来帮 助他完成这件事。

    Input

      第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相连。结点编号的范围为1-N且编号两两不同。

    Output

    一行一个整数Ans,表示所求的方案数。

    Sample Input

    6
    1 2
    2 3
    2 4
    4 5
    5 6

    Sample Output

    3

    HINT

    100%的数据满足N<=1000000。

    正解:迷之推导

    解题报告:

      推导一下,每种块的大小最多一个方案。具体参见:http://blog.csdn.net/lych_cys/article/details/50676685

     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 #ifdef WIN32   
    14 #define OT "%I64d"
    15 #else
    16 #define OT "%lld"
    17 #endif
    18 using namespace std;
    19 typedef long long LL;
    20 const int MAXN = 1000011;
    21 int n,ecnt,ans;
    22 int first[MAXN],to[MAXN*2],next[MAXN*2],size[MAXN],sum[MAXN];
    23 
    24 inline int getint()
    25 {
    26        int w=0,q=0;
    27        char c=getchar();
    28        while((c<'0' || c>'9') && c!='-') c=getchar();
    29        if (c=='-')  q=1, c=getchar();
    30        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
    31        return q ? -w : w;
    32 }
    33 
    34 inline void dfs(int x,int fa){
    35     size[x]=1;
    36     for(int i=first[x];i;i=next[i]) {
    37     int v=to[i];
    38     if(v==fa) continue;
    39     dfs(v,x);
    40     size[x]+=size[v];
    41     }
    42     sum[size[x]]++;
    43 }
    44 
    45 inline void work(){
    46     n=getint(); int x,y;
    47     for(int i=1;i<n;i++) {
    48     x=getint(); y=getint();
    49     next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y;
    50     next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
    51     }
    52     dfs(1,0);
    53     for(int i=1;i<=n;i++) {
    54     for(int j=i*2;j<=n;j+=i)
    55         sum[i]+=sum[j];
    56     if(sum[i]*i==n) ans++;
    57     }
    58     printf("%d",ans);
    59 }
    60 
    61 int main()
    62 {
    63   work();
    64   return 0;
    65 }
  • 相关阅读:
    poj3468(A Simple Problem with Integers)线段树+树状数组
    关于JVM——JVM内存模型
    关于JVM——类加载机制
    关于JVM(二)
    关于JVM(一)
    关于LongAdder
    关于Future
    关于Fork/Join
    关于Atomic
    关于LockSupport
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5712379.html
Copyright © 2011-2022 走看看