Atcoder abc248
https://atcoder.jp/contests/abc248/tasks
G - GCD cost on the tree
n点无向树
点i上有值ai
C(u,v) = 简单路径u..v上 点个数 乘 点上ai的gcd
求所有点对的 C的和,mod 998244353
范围
n 1e5
ai [1,1e5]
8s
2048mb
我的思路
显然暴力算 至少要 n^2
注意到的是 Ai很小, 如果能变成 不同gcd结果的贡献值的和 就好了
有点想做容斥, 但容斥的代价函数并不能用当前gcd
如果选定一个点必定经过, 那么可能的gcd都是它的因数, 虽然这里log了,但是要找路径还是n, 这样依然是n^2 以上
再看贡献count(u..v) * gcd(a[u]...a[v])
可以转化成, u
会贡献了覆盖了u
的线段次数, 每次都是u
的因子
那么每个 v1…u…v2 在u上的贡献是 gcd(gcd(v1..u),gcd(v2..u)), 且v1,v2 不在u的同一个分叉上
f[child v0] = sum c0[g] x^g
f[child v1] = sum c1[g] x^g
sf[v1,v2] = f[v1] + f[v2]
ans += sf[0..i-1] * f[vi]
(k[gcd(g0,g1)] += k0[g0] * k1[g1]`
= ((E+f[0]+f[1]+…+f[i]) ^ 2 - E^2 - f[0]^2 -f[1]^2 -…-f[i]^2)/2
换根dp ???