【做题记录】CF1101D GCD Counting

  • \(\text{CF1101D GCD Counting }\)

    • 算法:树形 \(\text{dp}\)

题目:

给出一棵树,树有点权,共 \(n\) 个点,求树上的一条链,满足:链上所有点的点权的 \(gcd>1\) 且链上的点数最多。注意一个点也可以构成一条链。\(a_i\) 表示第 \(i\) 个点的点值。

\(n\le 2\times 10^5\)

题解:

首先不要去管 \(gcd\) 是多少,不用考虑重复计算。只要不互素。

对于每个节点 \(x\),做一个很显然的数位 \(\text{dp}\):用 \(f_{x,k}\) 表示以 \(x\) 为根节点往下去挂出的点的点权都能被 \(k\) 整除的最长链。

那么答案显然就是 \(\max \{f_{x,k}\},x\in [1,n]\)

对于 \(f\) 的转移很简单,往下搜遇到点 \(y,k\mid y\) 则更新继续搜,否则停止。

对于 \(k\),因为显然这条链的 \(gcd\) (也就是 \(k\))也是 \(a_x\) 的因子,所以 \(k\)\(a_x\) 的质因子即可。

由于 \(a_x\le 2\times10^5\),而 \(2\times 3\times 5\times 7\times 11\times 13\times 17\ge 10^5\),所以 \(k\) 的取值一共才 \(7\) 个,常数极小。

然后一边转移一边更新答案即可。

时间复杂度 \(O(7n)\)

posted @ 2022-01-07 19:34  trsins  阅读(24)  评论(0编辑  收藏  举报