uoj#33. 【UR #2】树上GCD
题解
考虑到恰好为 $i$ 不好求,我们可以求 $i$ 的倍数的个数然后容斥。于是我们可以枚举 $x$ 作为 $\text{lca}$ ,我们要计算 $d(u,x),d(v,x)$ 都是 $i$ 的倍数的 $(u,v)$ 数对数。因为这个跟深度有关,容易想到长链剖分。但是我们不能去跳最深深度的倍数,所以我们考虑分块,如果 $deep>\sqrt n$ ,那么单次跳不会超过 $\sqrt n$ 次,否则我们可以设 $g[i][j]$ 表示 $dp[v] \% i=j$ 的 $v$ 的个数,枚举 $i$ 即可。这样就避免了枚举最深深度,因此总效率为 $O(n \sqrt n)$ 。