题目大意
有一棵 $n$ 个点的树,每条边有边权,边权互不相同,范围为 $[1,m]$。
现在你要给每个点定一个点权,点权范围也是 $[1,m]$。
假设一条边连着 $a$ 和 $b$,边权为 $w$,那么点权 $v_a$ 和 $v_b$ 要满足 $\gcd(v_a,v_b)\not = w$。
求方案数。
medium:
$1 \leq n \leq m \leq 1000$
hard:
$1 \leq n \leq m \leq 10^5$
这个题挺有趣的。
medium
首先列出一个 dp:设 $f_{i,j}$ 表示第 $i$ 个点,点权为 $j$ 的方案数,记 $s_i=\sum_{j=1}^m f_{i,j}$,那么转移很简单:
计算减去 $[\gcd(j,k)=w]f_{son,k}$ 这一部分的时候,实际上 $j$ 和 $k$ 都是 $w$ 的倍数。由于边权互不相同,因此时间最多为
因此总的时间为 $O(nm+m^2\ln^2 m)$,这就可以过掉 medium 了。
hard
考虑优化这个 dp。可以发现,大部分的 $f_{i,j}$ 都等于 $\prod_{son}s_{son}$,只有 $m \ln m$ 个 $f_{i,j}$ 是特殊的。所以只要快速计算出这些特殊位置就行了。
即,对于 $i$ 的儿子 $son$(连过去的边的边权为 $w$),当 $j$ 为 $w$ 的倍数时,快速得到
莫比乌斯反演一下:
对于 $son$,枚举 $d$,然后枚举 $k$ 算出 $\mu(d) \sum_{k=1}^{\lfloor \frac{m}{wd} \rfloor} f_{son,kwd}$,最后枚举 $j$ 把这个 $d$ 的贡献加到那个 $j$ 里就好了。
来算一下复杂度。$d$ 的范围是 $[1,\lfloor \frac mw \rfloor]$,在枚举了 $d$ 以后枚举 $k$ 的时间就是
枚举 $j$ 同理,算上全部的 $w$ 的话就是
因此总时间是 $O(n+m\ln^2m)$
代码
1 |
|