Brief Description

給定一棵樹, 判斷是否可以將其分成\(\frac{n}{k}\)個聯通塊, 其中每個聯通塊的大小均爲k.

Algorithm Design

我們有一個結論: k可行iff存在\(\frac{n}{k}\)個點, 以這些點爲根的子樹大小爲k或k的倍數.

讀者可以自行yy一下證明.

有了這個結論之後, 我們可以算出每個size, 用一個桶統計一下就好了.

Code

#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstring>
const int maxn = 1200000;
int fa[maxn], n, divide[maxn], size[maxn], f[maxn], tot = 0;
void fuck(int n) {
int i;
for (i = 1; i * i < n; i++) {
if (n % i == 0) {
divide[tot++] = i;
divide[tot++] = n / i;
}
}
if (i * i == n)
divide[tot++] = i;
std::sort(divide, divide + tot);
}
int main() {
// freopen("sdoi12_divide.in", "r", stdin);
// freopen("sdoi12_divide.out", "w", stdout);
scanf("%d", &n);
char ch = getchar();
int cnt = 0;
while (cnt < (n - 1)) {
int x = 0;
while (!isdigit(ch))
ch = getchar();
while (isdigit(ch)) {
x = x * 10 + ch - '0';
ch = getchar();
}
cnt++;
fa[cnt + 1] = x;
}
fuck(n);
for (int T = 1; T <= 10; T++) {
printf("Case #%d:\n", T);
memset(size, 0, sizeof(size));
memset(f, 0, sizeof(f));
for (int i = 2; i <= n; i++) {
if (T != 1) {
fa[i] = (fa[i] + 19940105) % (i - 1) + 1;
}
}
for (int i = n; i; i--)
size[fa[i]] += ++size[i];
for (int i = 1; i <= n; i++)
f[size[i]]++;
for (int i = 0; i < tot; i++) {
int tmp = 0;
for (int j = divide[i]; j <= n; j += divide[i])
tmp += f[j];
if (tmp == n / divide[i]) {
printf("%d\n", divide[i]);
}
}
}
}

最新文章

  1. jQuery判断及更改checkbox状态
  2. 李洪强iOS经典面试题156 - Runtime详解(面试必备)
  3. Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)
  4. 学习笔记:MySQL数据库初步 概念
  5. myeclipse如何修改Web项目名称,eclipse如何修改项目名字
  6. 32-bit Assembly on x86_64 Linux (Use Nasm and ld&amp;gcc)
  7. 结构体类型定义(C语言)
  8. linux下如何安装配置redis及主从配置
  9. web后门top
  10. PCB阻抗调节
  11. xml学习总结(四)
  12. 如何使用iframe实现隐藏的CSRF
  13. C#Transfrom
  14. .Net中如何使用MySql连接池
  15. 论javascript模块化的优缺
  16. MVC 验证码
  17. NIO(三、Channel)
  18. (转)Linux系统安装时分区的选择
  19. LeetCode 53. Maximum Subarray(最大的子数组)
  20. 项目(1)----用户信息管理系统(5)---(剩余jsp界面)

热门文章

  1. ACE_Select_Reactor_T 介绍 (2)
  2. 安装mathtype出问题卸载后 office2016打开mathtype弹错误窗口
  3. Qt 汽车仪表再次编写,Widget,仪表显示,绘制界面
  4. Ubuntu下使用Git_5
  5. Linux服务架设篇--traceroute命令
  6. deeplearning.ai课程学习(2)
  7. 并查集——poj1611(入门)
  8. lintcode-116-跳跃游戏
  9. 虚拟机CentOS7.2 1611 Minimal最小化安装后桥接固定ip
  10. TCP的挥手协议和握手协议