Uoj 33 树上GCD (树分治)

2023-11-09

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;


#define N 300020
#define B 300
#define M 600200
#define inf 0x3f3f3f3f
#define mod 1000000007
#define LL long long
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define MP make_pair
#define ui unsigned int

int n, fa[N];
int fst[N], nxt[M], vv[M], e;
int q[N], qh, qt;
int dep[N], sz[N], mx[N];
LL ans1[N], ans2[N];
bool vis[N];
int rt;
LL x[N], y[N], xx[N], yy[N];
LL F[B + 10][B + 10];


void init() {
	memset(fst, -1, sizeof fst);
	e = 0;
}
void add(int u, int v) {
	vv[e] = v, nxt[e] = fst[u], fst[u] = e++;
}

void bfs(int s, int fd) {
	dep[s] = fd;
	qh = qt = 0;
	q[qt++] = s;
	while(qh < qt) {
		int u = q[qh++];
		for(int i = fst[u]; ~i; i = nxt[i]) {
			int v = vv[i];
			if(vis[v]) continue;
			dep[v] = dep[u] + 1;
			q[qt++] = v;
		}
	}
}

void get_rt(int u) {
	bfs(u, 0);
	for(int i = qt - 1; i >= 0; --i) {
		int u = q[i];
		sz[u] = 1;
		for(int j = fst[u]; ~j; j = nxt[j]) {
			int v = vv[j];
			if(vis[v]) continue;
			sz[u] += sz[v];
		}
	}
	int tmp = n + 1;
	for(int i = 0; i < qt; ++i) {
		int u = q[i];
		mx[u] = 0;
		for(int j = fst[u]; ~j; j = nxt[j]) {
			int v = vv[j];
			if(vis[v]) continue;
			mx[u] = max(mx[u], sz[v]);
		}
		mx[u] = max(mx[u], qt - sz[u]);
		if(mx[u] < tmp) tmp = mx[u], rt = u;
	}
}



void divide(int s) {
	get_rt(s);
	vis[rt] = 1;
	int rrt = rt;
	int tp = 0;

	for(int i = fst[rt]; ~i; i = nxt[i]) {
		int v = vv[i];
		if(vis[v]) continue;
		bfs(v, 1);
		tp = max(tp, qt);
		for(int j = 0; j < qt; ++j) {
			int u = q[j];
			y[dep[u]]++;
			ans2[dep[u]]++;
		}
		for(int j = 1; j <= qt; ++j) {
			x[j] += y[j];
			for(int k = j; k <= qt; k += j) {
				yy[j] += y[k];
			}
		}
		for(int j = 1; j <= qt; ++j) {
			ans1[j] += 1LL * xx[j] * yy[j];
			xx[j] += yy[j];
			yy[j] = y[j] = 0;
		}
	}
	x[0]++;
	int mx_qt = 0;

	int t = 1;
	for(int u = rt; u != s; ++t) {
		u = fa[u];
		bfs(u, 0);
		mx_qt = max(mx_qt, qt);
		for(int i = 1; i < qt; ++i) {
			y[dep[q[i]]]++;
		}
		for(int i = 1; i <= qt; ++i) {
			for(int j = i; j <= qt; j += i)
	
				yy[i] += y[j];
		}
		for(int i = 1; i <= min(qt, B); ++i) {
			if(F[i][t%i] == -1) {
				F[i][t%i] = 0;
				for(int j = (i - t % i) % i; j <= tp; j += i) {
					F[i][t%i] += x[j];
				}
			}
			ans1[i] += F[i][t%i] * yy[i];
		}
		for(int i = B + 1; i <= qt; ++i) {
			for(int j = (i - t % i) % i; j <= tp; j += i)
				ans1[i] += x[j] * yy[i];
		}
		for(int i = 1; i <= qt; ++i) y[i] = yy[i] = 0;
		vis[u] = 1;
	}
	for(int i = 1; i <= min(mx_qt, B); ++i) {
		for(int j = 0; j < i; ++j)
			F[i][j] = -1;
	}
	for(int u = rt; u != s;) {
		u = fa[u];
		vis[u] = 0;
	}

	--t;
	LL tmp = 0;
	for(int k = 1; k <= tp + t; ++k) {
		if(k - 1 <= tp) tmp += x[k-1];
		if(k - t - 1 >= 0 && k - t - 1 <= tp) tmp -= x[k-t-1];
		ans2[k] += tmp;
	}
	for(int i = 0; i <= tp; ++i) x[i] = xx[i] = 0;
	if(rrt != s) divide(s);
	for(int i = fst[rrt]; ~i; i = nxt[i]) {
		int v = vv[i];
		if(!vis[v]) {
			divide(v);
		}
	}
}
int main() {
	scanf("%d", &n);
	init();
	for(int i = 2; i <= n; ++i) {
		scanf("%d", &fa[i]);
		add(fa[i], i);
	}
	memset(F, -1, sizeof F);
	divide(1);
	for(int i = n - 1; i >= 1; --i) {
		for(int j = i + i; j <= n - 1; j += i) {
			ans1[i] -= ans1[j];
		}
	}
	for(int i = 1; i <= n - 1; ++i) {
		printf("%lld\n", ans1[i] + ans2[i]);
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Uoj 33 树上GCD (树分治) 的相关文章

随机推荐

  • 训练图像识别神经网络,神经网络训练过程图解

    卷积神经网络怎么生成图片 需要使用类似GAN的生成模型去做 望采纳GAN的基本原理其实非常简单 这里以生成图片为例进行说明 假设我们有两个网络 G Generator 和D Discriminator 正如它的名字所暗示的那样 它们的功能分
  • 系统更新pip无法使用

    报错信息如下 WARNING pip is configured with locations that require TLS SSL however the ssl module in Python is not available p
  • Hadoop、Spark等5种大数据框架对比,你的项目该用哪种?

    Hadoop Spark等5种大数据框架对比 你的项目该用哪种 2016 11 23 大愚若智 译 InfoQ 作者丨Justin Ellingwood 译者丨大愚若智 审校丨Cindy 本文将介绍并对比5种主流大数据框架 助你更深层次了解
  • 毕业设计 树莓派+云平台实时室内环境监测系统

    文章目录 0 前言 1 简介 2 主要器件 3 DHT11温湿度传感器 4 具体实现 5 部分代码 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学
  • Google浏览器首页被篡改(非常有效的解决方法)

    问题描述 1 本人谷歌浏览器首页被hao 123篡改 2 浏览器输入chrome version 可以看到 命令行 最后面被篡改 解决方法 1 在chrome浏览器输入chrome version gt 复制命令行内容 gt 粘贴到浏览器属
  • 关于区块链的原理:去中心化的分布式记账系统

    区块链技术的核心是所有当前参与的节点共同维护交易及数据库 它使交易基于密码学原理而不基于信任 使得任何达成一致的双方 能够直接进行支付交易 不需第三方的参与 从技术上来讲 区块是一种记录交易的数据结构 反映了一笔交易的资金流向 系统中已经达
  • RFID在图书馆系统管理中的有哪些应用优势?

    RFID在图书馆系统管理中的应用优势 截至目前 基于RFID技术在图书馆行业的应用 算算已有十年有余 从传统的简单的自助借还图书到目前多种智能化功能的实现 其技术发展进步的速度非常迅速 尤其是与传统的条形码和磁条技术相比 具有其明显的优势
  • 交互式SHELL和非交互式SHELL、登录SHELL和非登录SHELL的区别

  • keil5在点击debug时,全速运行按钮不能按的情况

    在我程序编译完成后 下载了程序 点击debug进行调试 跳转到debug页面时 发现 run 按钮已经按下 但是不在运行代码 只是在空跑 出现这种情况 目前有以下几种情况 1 在 options for target 选项中的 target
  • Tableau_day6

    1 填充地图 1 1 各省售电量填充地图 导入数据 设置地理格式 双击 省市 生成一个符号地图 将当期值放入颜色 生成填充地图 在地理面积内进行颜色填充 设置颜色 设置未知 设置 位置 标签 显示位置信息 修改某些位置信息 要调整注释边框
  • 远程调试(Remote Debugging)

    当运行的程序出现问题时 我们通常通过调试来追踪和定位问题 但是 当运行错误的机器上没有调试工具 我们就需要实现远程调试 简单地说 就是要调试的程序和调试器不在一台机器上 移动端web调试 alert虽然是个土方法 但也是万能的 不过这样会中
  • Javascript与CSS在IE和Firefox中的误区及区别

    Javascript中的常见问题 1 集合类对象问题 现有代码中许多集合类对象取用时使用 IE 能接受 Firefox 不能 解决方法 改用 作为下标运算 如 document forms formName 改为 Js代码 document
  • Vm配置虚拟网络信息&配置虚拟机防火墙&取消软件安装限制&解决问题Temporary failure in name resolution

    目录 配置环境 一 前置知识 1 NAT模式 用的比较多 2 桥接模式 3 仅主机模式 二 修改虚拟网卡信息 1 首先我们可以看到我们这里有两张网卡 问题一 你们可以想一下假如我没有桥接到我的真实可以上网的网卡上会怎么样 这种错误我之前犯过
  • Google敦促更快普及VP9视频压缩技术

    转自 http www cnetnews com cn 2013 0516 2159618 shtml CNET科技资讯网 05月16日 国际报道 计算机行业才谈及VP8解编码技术 Google就希望人们接受它的VP9技术了 Google的
  • DES 密钥生成 加密解密

    import java security InvalidKeyException import java security NoSuchAlgorithmException import java security SecureRandom
  • E1,T1, PRI, Trunk

    E1 T1 PRI Trunk 北美的24路脉码调制PCM简称T1 速率是1 544Mbit s 欧洲的30路脉码调制PCM简称E1 速率是2 048Mbit s 我国采用的是欧洲的E1标准 E1的一个时分复用帧 其长度T 125us 共划
  • read_csv文件读写参数详解————

    python pandas IO tools 之csv文件读写 英文原文 pandas IO tools 读取csv文件 pd read csv 写入csv文件 pd to csv pandas还可以读取一下文件 read csv read
  • .NET诞生20周年 .NET 7有什么新东西?

    首个预览版已发布 NET 7 有什么新东西 随着第一个预览版发布 NET 7 渐渐浮出水面 NET 高级项目经理 Jeremy Likness 在官方博客中介绍了 NET 7 的主要发展方向 俺整理给大伙做一下介绍 NET 7 建立在 NE
  • 实训二十二:交换机标准 ACL 配置

    一 实验目的 1 了解什么是标准的 ACl 2 了解标准 ACL 不同的实现方法 二 应用环境 1 ACL Access Control Lists 是交换机实现的一种数据包过滤机制 通过允许或拒绝特定的数据包进出网络 交换机可以对网络访问
  • Uoj 33 树上GCD (树分治)

    include