题目描述

李华终于逃离了无尽的英语作文,重获自由的他对一棵树产生了兴趣。
首先,他想知道一棵树是否能分成大小相同的几块(即切掉一些边,使得每个连通块的点数相同)。然后,他觉得这个问题过于简单,于是他想知道一共有多少种方案可以把这棵树分成大小相同的几块。
然后他发现自己不会了,于是向聪明的你求助。


输入格式

第一行一个数,表示数的大小。
第二行至第$N$行,每行两个数$x,y$表示$x$和$y$之间有一条边。


输出格式

一行,表示方案数。


样例

样例输入

6
1 2
2 3
2 4
4 5
5 6

样例输出

3


数据范围与提示

对于$30\%$的数据,$1\leqslant n\leqslant 100$。
对于$60\%$的数据,$1\leqslant n\leqslant 100,000$。
对于$100\%$的数据,$1\leqslant n\leqslant 1,000,000$。


题解

首先,块的大小和块的个数一定能整除$N$,所以我们可以先预处理出来所有$N$的因子。

然后我们来考虑如何判断方案是否可行,显然只有一棵子树的大小是当前尝试块的大小或其整数倍才可以,那么问题就简单多了。

但是这时候,你可能会发现,时间复杂度还是可怕的$\Theta(n\sqrt n)$,虽然同桌随机化根在交了$5,6,7,8,9,10$遍后还是$A$了这道题吧。

当然我们不能当像他一样的颓狗

那么应该怎么办呢?

考虑在搜索的时候如何进行剪枝,可以先预处理出来每棵子树的大小,如果当前这棵子树的大小恰好等于块的大小我们那就可以将其剪掉,如果它没有块大,那么记录还差多少,看是否可行,如果它比块大,那么就接着往下搜。

时间复杂度:$\Theta(n\sqrt n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[3000000];
int head[1000010],cnt;
int n;
int ans=2;
int que[1000],size[1000010],fa[1000010];
void add(register int x,register int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void pre_dfs(register int x)
{
size[x]++;
for(register int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa[x])
{
fa[e[i].to]=x;
pre_dfs(e[i].to);
size[x]+=size[e[i].to];
}
}
int judge(register int x,register int w)
{
register int sz=1;
for(register int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==fa[x])continue;
if(size[e[i].to]>=w)
{
register int flag=judge(e[i].to,w);
if(flag==-1)return -1;
sz+=flag;
}
else sz+=size[e[i].to];
if(sz>w)return -1;
}
if(sz==w)return 0;
return sz;
}
int main()
{
register int n;
scanf("%d",&n);
for(register int i=2;i<n;i++)
if(!(n%i))que[++que[0]]=i;
for(register int i=1;i<n;i++)
{
register int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
pre_dfs(1);
for(register int i=1;i<=que[0];i++)
if(judge(1,que[i])!=-1)ans++;
cout<<ans<<endl;
return 0;
}

rp++

[CSP-S模拟测试]:count(树分块)的更多相关文章

  1. [CSP-S模拟测试]:砍树(数学+模拟)

    题目传送门(内部题1) 输入格式 第一行两个整数$n$,$k$,代表树苗的数量和最大看书的总长度.第二行n个整数$a_i$,代表林先森希望每棵树苗的最终高度. 输出格式 一行一个整数,代表最大可能的d ...

  2. [CSP-S模拟测试]:养花(分块)

    题目描述 小$C$在家种了$n$盆花,每盆花有一个艳丽度$a_i$.在接下来的$m$天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅,并在晚上放回.同时每天有特定的光照强度$k_i$,如果这一 ...

  3. [CSP-S模拟测试]:超级树(DP)

    题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...

  4. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  5. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  6. 洛谷 P6177 - Count on a tree II/【模板】树分块(树分块)

    洛谷题面传送门 好家伙,在做这道题之前我甚至不知道有个东西叫树分块 树分块,说白了就是像对序列分块一样设一个阈值 \(B\),然后在树上随机撒 \(\dfrac{n}{B}\) 个关键点,满足任意一个 ...

  7. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

    题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

随机推荐

  1. 05 使用bbed跳过归档恢复数据文件

    5 使用BBED跳过归档 在归档模式下,缺失了一部分的归档日志文件,对数据文件进行恢复 1 开启归档 --shutdown immediate --startup mount --alter data ...

  2. usb接口类型 简单分类辨识

    usb接口类型 简单分类辨识 - [相似百科] 庆欣 0.0 4 人赞同了该文章 1. 先放图,随着越来越多的接触智能设备,会遇到各种各样的usb接口,对于很多人来说,接口类型只有:usb接口,安卓接 ...

  3. 来自python自学者的小问题

    我想使用python的第三方库,但是我的IDE给我一个错误代码: D:\untitled\venv\Scripts\python.exe "D:/py code/venv/sxsxsxsxs ...

  4. 2019春第十一周作业Compile Summarize

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能按自己的想法解出题目 这个作业在那个具体方面帮助我实现目标 能朝着软件工程师方向发展 参考文献与网址 C语言 ...

  5. SSI框架【Struts、Spring、iBatis、Hibernate】

    1.B/S架构的JavaEE开发设计模式,JavaEE架构分成三个层次即表现层.业务逻辑层.数据持久层:而这三层分别通过Struts.Spring.iBatis开源的框架紧密组合在一起的. Strut ...

  6. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  7. 用命令行远程导出MySQL数据

    mysqldump -h10.10.9.197 -uroot -proot --default-character-set=utf8 0610_eshop >C:/Users/Adm inist ...

  8. body传参?parameter传参?Request Payload?Query String Parameter?

    今天,是有委屈的一天:今天,是有小情绪的一天.所以,我们要对今天进行小结,跟它做一个了断! 今天,后端来一个接口,告诉我"要用post请求,parameter形式传参".over. ...

  9. python sys模块导入和模块的使用

    sys故名思意,就是系统模块,系统模块内置很多方法,怎么样去调用方法呢 1,argv 参数 sys.argv() 2,exit() 退出程序 sys.exit() 3,version  获取版本信息 ...

  10. python学习笔记(7)文件的访问与函数式编程

    一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...