【UR #2】树上GCD

题目描述

给定一棵 n n n个点的以 1 1 1为根的有根树,设 d ( a , b ) d(a,b) d(a,b)表示 a a a, b b b两点的树上距离,对于 ∀ i ∈ [ 1 , n ) \forall i\in[1,n) i[1,n),求出有多少对 x , y x,y x,y满足 gcd ⁡ ( d ( x , l c a ( x , y ) ) , d ( y , l c a ( x , y ) ) = i \gcd(d(x,lca(x,y)),d(y,lca(x,y))=i gcd(d(x,lca(x,y)),d(y,lca(x,y))=i
n ≤ 200000 n\le200000 n200000

题解

首先把 l c a ( x , y ) = x 或 y lca(x,y)=x或y lca(x,y)=xy的给处理了
转化一下题目,求出 g ( d ) = [ d ∣ i ] ⋅ a n s i g(d)=[d|i]\cdot ans_i g(d)=[di]ansi,最后容斥一下就可以得到 a n s ans ans
考虑一个提示性部分分:除根结点外的每个结点至多拥有一个孩子
相当于在根上挂上了若干条链,设第 i i i条链长度为 h i h_i hi,对于一个 d d d,第 i i i条链高度为 d d d的倍数的点有 ⌊ h i d ⌋ \lfloor\frac{h_i}{d}\rfloor dhi个, g ( d ) = ∑ i < j ⌊ h i d ⌋ ⌊ h j d ⌋ g(d)=\sum_{i<j}\lfloor\frac{h_i}{d}\rfloor\lfloor\frac{h_j}{d}\rfloor g(d)=i<jdhidhj,这个随便处理一下就可以做到 O ( n ) O(n) O(n)

接下来考虑点分治,设当前分治中心为 m i d mid mid,根为 r t rt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值