【UOJ#33】【UR #2】树上GCD
求解树上两个点到lca的距离的最大公约数是k的对数
首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数。
考虑枚举lca,这个问题就和深度有关,那么可以长链剖分,然后每次枚举倍数是O(dlogd)的,但是这里的深度不止是轻链还有重链,那么复杂度就不对了。
但是我们发现当这个倍数很大时复杂度是正确的,每次维护轻链的倍数,然后对于每个倍数跳,总复杂度就是O(nn)O(n\sqrt{n})O(nn)。但是很小的时候就不对了,但是我们利用根号分类讨论,发现很小的数最多只有O(n)O(\sqrt{n})O(n)个,那么我们可以直接存下来这些数,用一个数组g[i][j]表示深度模i为j的点有多少个。
这样子大的数我们直接暴力,小的数进行存储,就可以实现复杂度平衡。