zoukankan      html  css  js  c++  java
  • 【动态规划】cf1034C. Region Separation

     质因数分解套路的复杂度分析的动态规划

    题目大意

    有一颗$n$个节点有点权的树,初始整棵树为$1$号区域,要求满足下列规则:

    • 除非$i$是最后一个等级,否则每一个$i$级区域都要被分成至少两个$i+1$级区域
    • 对于每种等级,每个点必须恰好属于一个区域
    • 一个区域的点集必须是连通的
    • 对于相同等级,每个区域必须拥有相同的点权和

    问有多少种合法的划分方案,$n le 10^6,a_i le 10^9$.


    题目分析

    首先考虑判断把树分为$k$个2级区域的合法性$f_k$,记点权和为$tot$。

    一种朴素的想法就是对于每一个$k$,自底向上遍历整棵树,若剩余子树大小恰好为$totover k$,就割去这颗子树;如果整棵树能够被处理完,$k$就是合法的。每次判定复杂度为$O(n)$.

    注意到这个想法里,每次割去子树的大小$s_i$恰好是$totover k$的倍数;并且不难发现,$k$合法的充要条件就是恰有$k$个$s_i≡0( ext{mod }frac{tot}{k})$。简短解释一下:对于一颗$s_i≡0( ext{mod }frac{tot}{k})$的子树,由于它的所有子树都奉行割去$s_j≡0( ext{mod }frac{tot}{k})$的原则,那么剩下的包括点$i$的连通块就是$i$子树内最小的$ge {totover k}$的连通块。因此,$sum [s_k≡0( ext{mod }frac{tot}{k})] le k$;并且当且仅当$=k$时合法。

    有了这个性质,考虑如何统计$f_k$。容易发现对于合法的$k$,$frac{tot}{k}$的任意约数$k'$都是合法的。而对于子树$s_i$,其最小有贡献的$k=frac{tot}{ ext{gcd}(s_i,tot)}$。所以这里只需要对每个$s_i$存下最小的合法$k$,再以质因数分解题的套路处理一遍就能算出$[f_k=k]$了。因此处理$f_k$的复杂度是$O(nln n)$。

    接下去考虑dp计算把整棵树分为若干个$i$级区域的方案数$g_i$。

  • 相关阅读:
    桶排序
    linux下如何修改进程优先级?
    在旋转排序数组之后的数组中找到目标值的位置(很多遍 ,总是晕)
    PHP生成随机数函数rand(min,max)
    使用PHP编写发红包程序
    maven的lifecycle
    mysq中char,varchar,text的区别
    contrller层的编码设设计流程以及详细配置
    mybatis的dao层和service层的编码设计的配置
    Next_day()函数的用法
  • 原文地址:https://www.cnblogs.com/antiquality/p/10692714.html
Copyright © 2011-2022 走看看