2889: Tree Conundrum

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 61  Solved: 37
[Submit][Status][Discuss]

Description

给定一棵N个节点的无根树,现要求有多少种合法的分块方案。
 所谓合法的分块方案,就是将树分为若干个连通块,满足每个连通块内点数相同。

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
【数据规模和约定】
10%的数据满足N<=16,
30%的数据满足N<=100,
50%的数据满足N<=50000,
100%的数据满足N<=1000000。
 
 
    之前做过一道类似的树分块的题目所以才有一些思路。
    首先,对于每一种块的大小,方案要么没有,要么只有一种,接下来我来证明这一点。
   
    对于一种块的大小i,如果要有方案,那么先得保证i是n的约数,并且 子树siz 是i倍数的点 的个数必须正好是 n/i。
    为什么呢?
    考虑把那些siz是i倍数的点 在原树中建成一颗类似虚树的树(虚树里只有 siz 是i倍数的点,并且每个点向祖先第一个也是虚树中的点连边),在虚树中每个点的siz肯定要大于所有子节点的siz和(因为它自己也要算啊),并且每个叶子节点的siz是i,所以在虚树中一个大小是u的子树最多只能有u/i个节点,于是我们论证了虚树中的点个数<=n/i。
   
    那么虚树中点的个数正好是n/i的时候一定有解,并且小于的时候一定无解呢?
    对于第一个问题,我们还是考虑虚树中的点和它们的儿子的关系,我们用一个点的子树减去它所有儿子的子树所得到的联通块大小一定是i的倍数,并且如果正好有n/i个节点的话,那么正好可以证明每个联通块的大小都是i;
    对于第二个问题,我们可以发现只有siz是i倍数的点可以作为联通块的lca,所以小于的时候一定无解。
 
    如果上面的看懂了,那么方案的唯一性就不难证明了。因为我们选联通块的策略是唯一的,所以对于一种块的大小的方案也是唯一的。
 
#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;
}

  

bzoj 2889: Tree Conundrum的更多相关文章

  1. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  2. bzoj 2631: tree 动态树+常数优化

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Descrip ...

  3. [BZOJ - 2631] tree 【LCT】

    题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...

  4. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  5. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  6. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  7. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  8. BZOJ 3282 Tree Link-Cut-Tree(LCT)

    题目大意: 给定N个点以及每一个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y ...

  9. BZOJ 2631: tree [LCT splay区间]

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 3854  Solved: 1292[Submit][Status][Discus ...

随机推荐

  1. git 远程仓库 与本地项目 挂钩 全过程

    摘要:学了Android 快三个月了,依旧不会git,真的有些丢人.git是一个非常棒的团队协作的工具.其实也是分分钟的事情.Follow Me! Step 1 在码云上新建一个项目,作为远程仓库.里 ...

  2. HDU 5657 CA Loves Math 状压DP + 枚举

    题意: 给出\(A(2 \leq A \leq 11), n(0 \leq n \leq 10^9), k(1 \leq k \leq 10^9)\). 求区间\([1, A^n]\)中各个数字互不相 ...

  3. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 19: ordinal not in range(128)

    解决方案: 1: 在网上找到的解决方案是: 在调用import matplotlib.pyplot as plt前 import sys sys.setdefaultencoding(“gbk”) 让 ...

  4. MD5碰撞

    if ( $_POST['param1'] !==$_POST['param2'] && md5($_POST['param1']) === md5($_POST['param2']) ...

  5. python - web自动化测试 - 元素操作 - 等待

    # -*- coding:utf-8 -*- ''' @project: web学习 @author: Jimmy @file: wait.py @ide: PyCharm Community Edi ...

  6. mysql数据库二进制初始化出现:170425 17:47:04 [ERROR] /application/mysql//bin/mysqld: unknown option '--skip-locking' 170425 17:47:04 [ERROR] Aborting 解决办法

    [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/application/mysql/ --data ...

  7. docker常用命令整理

    Docker常见用法整理 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建.容器与镜像的关系类似于 ...

  8. 使用libcurl提示 LNK2001的错误

    vs使用libcurl(static library),link时报错: error LNK2001: unresolved external symbol __imp__curl_easy_perf ...

  9. 一个javascript继承和使用的例子

    继承可以帮助我们实现代码的重用,把对象的属性写入构造函数,对象的方法写入原型后,以下例子演示继承的使用: 示例的css和js在后 父实例,得到一个间隔1s的轮播: <!DOCTYPE html& ...

  10. HTML+CSS 滚动条样式自定义 - 适用于 div,iframe, html 等

    友言:这两天被滚动条整的无与伦比,在此做下总结: 首先自定义浏览器滚动条的实现原理:计算浏览器滚动条的高度,层级1的高度与滚动条的总高度是一样的,通过相似比例计算: 浏览器滚动条总高度 :滚动条高度 ...