P2351 [SDOi2012]吊灯

 
 

题意:
  一棵树,能否全部分成大小为x的联通块。

分析:
  显然x是n的约数。然后对于一个约数x,判断能否分成 $ \frac{n}{x} $ 个大小为x的联通块。

  结论:如果x可以,那么一定存在$ \frac{n}{x} $个节点的子树大小是x的倍数。

  证明:上面的结论说明的也就是每个大小是x的倍数的点,对答案的贡献是1(每个点都可以分出一个大小为x的块),加起来就是$ \frac{n}{x} $。

  现在就要考虑一个点u的siz是kx,然后它的子树里如果没有其他点的siz的是x的倍数的话,它的贡献是1,它可以从根节点开始,分出一个包含根节点,一共x个点的联通块。

  然后考虑u的子树里还有一个点v的siz是x的倍数,那么如果它们还能分成两个大小为x的块的话,那么每个这样的点的贡献还是1。首先从在v的子树里一定可以从根开始分出一个大小为x的块(u在其中),然后u的子树里需要找一个大小为x的块,且不使用v中的点。假设去掉v中的点还剩siz[u]-siz[v]个,这也是x的倍数,所以u的子树里,从根开始,不占用v的点,还可以分出一个大小为x的块。说明u的子树可以贡献2,uv各自贡献1。

  如果u的子树还有这样的点,那么把v删掉,还是两个点的情况,所以还是合法的。

  到此发现每个大小为x的倍数的点,会对答案贡献1。$ \frac{n}{x} $$个,就会有$ \frac{n}{x} $个大小为x的联通块,如果小于则不行。

 
代码:
 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int fa[N], cnt[N], siz[N], n;
vector<int> v; bool check(int x) {
int res = ;
for (int i=x; i<=n; i+=x) res += cnt[i];
return res >= n / x;
} int main() {
n = read();
for (int lim=sqrt(n),i=; i<=lim; ++i) {
if (n % i == ) {
v.push_back(i);
if (n / i != i) v.push_back(n / i);
}
}
sort(v.begin(), v.end());
for (int i=; i<=n; ++i)
fa[i] = read();
for (int T=; T<=; ++T) {
printf("Case #%d:\n",T);
for (int i=; i<=n; ++i) cnt[i] = , siz[i] = ;
for (int i=n; i>=; --i) siz[fa[i]] += siz[i], cnt[siz[i]] ++;
for (int i=; i<v.size(); ++i)
if (check(v[i])) printf("%d\n",v[i]);
if (T != ) for (int i=; i<=n; ++i)
fa[i] = (fa[i] + ) % (i - ) + ;
}
return ;
}

最新文章

  1. ecmall中static变量的使用-model模型代码设计
  2. oracle如何写包
  3. STM8 EEPROM:
  4. sqlmap小白操作
  5. Dynamics AX 2012 R3 Demo 安装与配置 - 安装数据服务器、AOS和客户端 (Step 2)
  6. sprint3(第六天)
  7. 遍历Map集合的方法
  8. PHPcms 摘要
  9. as3.0服务端FMS软件常用的方法与属性参考示例
  10. nutch 二次开发
  11. linux局域网不能相互访问
  12. Codeforces Round #258 (Div. 2/B)/Codeforces451B_Sort the Array
  13. Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
  14. 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录
  15. Java经典编程题50道之十五
  16. 洛谷U19464 山村游历(Wander)(LCT,Splay)
  17. qemu 系列
  18. BurpSuite 各模块使用
  19. Javascript内置对象、原生对象、宿主对象关系
  20. 51Nod 1007:正整数分组(01背包)

热门文章

  1. ThreadLocal介绍
  2. Java---页面之间传值跳转
  3. perl学习---控制:unless,until,next,redo,last
  4. UVa 1442 - Cave
  5. 为什么 window.location.search 为空?
  6. SVN工具使用总结
  7. 二. Python WebDriver环境搭建
  8. 关于JavaScript中省略元素对数组长度的影响
  9. 【luogu P2919 [USACO08NOV]守护农场Guarding the Farm】 题解
  10. hdu 1010(迷宫搜索,奇偶剪枝)