在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
题目大意有一颗$n$个节点有点权的树,初始整棵树为$1$号区域,要求满足下列规则:
问有多少种合法的划分方案,$n \le 10^6,a_i \le 10^9$. 题目分析首先考虑判断把树分为$k$个2级区域的合法性$f_k$,记点权和为$tot$。 一种朴素的想法就是对于每一个$k$,自底向上遍历整棵树,若剩余子树大小恰好为$tot\over k$,就割去这颗子树;如果整棵树能够被处理完,$k$就是合法的。每次判定复杂度为$O(n)$. 注意到这个想法里,每次割去子树的大小$s_i$恰好是$tot\over k$的倍数;并且不难发现,$k$合法的充要条件就是恰有$k$个$s_i≡0(\text{mod }\frac{tot}{k})$。简短解释一下:对于一颗$s_i≡0(\text{mod }\frac{tot}{k})$的子树,由于它的所有子树都奉行割去$s_j≡0(\text{mod }\frac{tot}{k})$的原则,那么剩下的包括点$i$的连通块就是$i$子树内最小的$\ge {tot\over k}$的连通块。因此,$\sum [s_k≡0(\text{mod }\frac{tot}{k})] \le k$;并且当且仅当$=k$时合法。 有了这个性质,考虑如何统计$f_k$。容易发现对于合法的$k$,$\frac{tot}{k}$的任意约数$k'$都是合法的。而对于子树$s_i$,其最小有贡献的$k=\frac{tot}{\text{gcd}(s_i,tot)}$。所以这里只需要对每个$s_i$存下最小的合法$k$,再以质因数分解题的套路处理一遍就能算出$[f_k=k]$了。因此处理$f_k$的复杂度是$O(n\ln n)$。 接下去考虑dp计算把整棵树分为若干个$i$级区域的方案数$g_i$。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论