题目

Sherco是一位经验丰富的魔♂法师。
Sherco在第零次圣杯战争中取得了胜利,并取得了王之宝藏——王の树。
他想把这棵树砍去任意条边,拆成若干棵新树,并装饰在他的摩托上,让他的摩托更加酷炫。
但Sherco认为,这样生成的树不具有美感,于是Sherco想让每棵新树的节点数相同。
他想知道有多少种方法分割这棵树。
样例输入:
第一行一个正整数N,表示这棵树的结点总数。
接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相连。结点编号的范围为[1,N]。
6
1 2
2 3
2 4
4 5
5 6

样例输出:
一个整数,表示方案数。注意,不砍去任何一条边也算作一种方案。
3

数据范围:
对于40%的数据,N ≤ 15
对于60%的数据,N ≤ 10^5
对于100%的数据,N ≤ 10^6
数据规模非常大,请使用高效的读入方式。


剖解题目

。。。。。


思路

只知道和n的约数有关。。。。。


解法

40%:暴力枚举删哪些边。
60%:搞一搞可以知道一些性质。
1.树的大小只可能是n的约数。
2.树的大小确定后,如果有分割方案只可能有一种。
所以直接枚举树的大小,dfs判断即可。时间O(nn√)O(n\sqrt{n})
100%:继续找性质。
发现,如果一个节点可以作为一块的根,那么以这个节点为根的子树的size一定能被块的大小整除。
预处理出所有节点size,枚举树的大小k,如果size为k的倍数的节点数的大小是n/k的话,便是合法方案,加入答案。时间O(nlogn)O(n log_n)。
然而,如果用dfs弄会爆栈,所以用bfs吧(好难搞QwQ)


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;const int maxn=1000005;
int n,num,ans;
int fre[maxn*2],next[maxn*2],go[maxn*2],size[maxn],T[maxn*2],dad[maxn];
bool bz[maxn],b[maxn];void add(int x,int y)
{go[++num]=y;next[num]=fre[x];fre[x]=num;
}
int main()
{
//  freopen("T.in","r",stdin);scanf("%d",&n);fo(i,1,n-1){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}int h=0,t=1,hh=0,tt=0;T[1]=1;bool bo;while (h!=t){int u=T[++h];b[u]=true;int i=fre[u];while (i){if (b[go[i]]) {i=next[i];continue;}T[++t]=go[i];dad[go[i]]=u;i=next[i];}}h=1; t++;while (t!=h){int u=T[--t];size[u]++;int i=fre[u];while (i){if (go[i]==dad[u]) size[go[i]]+=size[u];i=next[i];}}ans=1;fo(i,2,n/2)if (n%i==0){int t=0;fo(j,1,n) if (size[j]%i==0) ++t;if (t==n/i) ++ans;}if (n!=1) printf("%d",ans+1);else printf("1");
}

树上摩托【NOIP2016提高A组模拟9.4】相关推荐

  1. JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球

    Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...

  2. JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护

    题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...

  3. 弄提纲【NOIP2016提高A组模拟7.19】

    题目: 新日暮里中,比冲是一位博学的哲学教授.由于最近要帮学生准备考试,他决定弄个提纲给学生.然而同事van不服气,觉得这样学生就没有了自我思考,便在提纲中添加废话. 比冲很无奈,他想找回原稿.我们把 ...

  4. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

  5. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列

    题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...

  6. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  7. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串

    Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...

  8. JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row

    Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...

  9. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症

    Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...

最新文章

  1. 如何复制一个目录里面的所有目录和文件
  2. 【Codeforces】920A Water The Garden(浇花)
  3. 找出1个小时前更新的文件并进行拷贝
  4. 计算机网络最基础知识
  5. 信息系统项目管理师-计算题专题(四)运筹学计算
  6. 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo
  7. Java源码:java.lang.reflect反射之AccessibleObject、ReflectionFactory、Filed、Method、Constructor类
  8. 单片机float数发给上位机_上位机倒计时器
  9. .NET Core 单元测试
  10. LintCode 1862. 给树浇水的时间(图的遍历)
  11. dede php标签 value=$v,dede:php标签是什么
  12. python怎么标注折线图_利用python画折线图
  13. C++语法(五)数据类型
  14. Segmentation Measures
  15. 适合产品经理的桌面壁纸-分类神器
  16. 哈夫曼树详解及其应用(哈夫曼编码)
  17. 华为开发者联盟Severless解决方案为鸿蒙生态构建发力
  18. win10计算机管理 用户,Win10专业版系统管理员帐户的开启设置方法
  19. vscode实用快捷键查找和替换
  20. Kafka入门(一)

热门文章

  1. 分享一个免费的听书、说书(文字转语音)、读书的好工具
  2. Vlog基础教程+系统教程
  3. 为什么过来人很多推荐出国读博?
  4. 【系统分析师之路】第十一章 新技术应用
  5. C# 键值对 KeyValue 解析
  6. 微软中国垂涎IBM大客户高薪挖走咨询师
  7. jenkins安装 插件插件失败 简单快捷安装办法
  8. Oracle数据库安全-版本补丁版本计划(202207更新)
  9. ava实现汉字转拼音,多音字处理
  10. 2021年高考成绩查询宜春昌黎,2021年宜春中考志愿设置