uoj#33. 【UR #2】樹上GCD

題目描述

題解

考慮到恰好爲 ii 不好求,我們可以求 ii 的倍數的個數然後容斥。於是我們可以枚舉 xx 作爲 lca\text{lca} ,我們要計算 d(u,x),d(v,x)d(u,x),d(v,x) 都是 ii 的倍數的 (u,v)(u,v) 數對數。因爲這個跟深度有關,容易想到長鏈剖分。但是我們不能去跳最深深度的倍數,所以我們考慮分塊,如果 deep>ndeep>\sqrt n ,那麼單次跳不會超過 n\sqrt n 次,否則我們可以設 g[i][j]g[i][j] 表示 dp[v]%i=jdp[v] \% i=jvv 的個數,枚舉 ii 即可。這樣就避免了枚舉最深深度,因此總效率爲 O(nn)O(n \sqrt n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章