【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

【UOJ#33】【UR #2】树上GCD

求解树上两个点到lca的距离的最大公约数是k的对数

首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数。

考虑枚举lca,这个问题就和深度有关,那么可以长链剖分,然后每次枚举倍数是O(dlogd)的,但是这里的深度不止是轻链还有重链,那么复杂度就不对了。

但是我们发现当这个倍数很大时复杂度是正确的,每次维护轻链的倍数,然后对于每个倍数跳,总复杂度就是 O ( n n ) O(n\sqrt{n}) O(nn )。但是很小的时候就不对了,但是我们利用根号分类讨论,发现很小的数最多只有 O ( n ) O(\sqrt{n}) O(n )个,那么我们可以直接存下来这些数,用一个数组g[i][j]表示深度模i为j的点有多少个。

这样子大的数我们直接暴力,小的数进行存储,就可以实现复杂度平衡。

posted @ 2021-01-18 08:51  dinlon  阅读(52)  评论(0)    收藏  举报