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

题目大意

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

  • 除非$i$是最后一个等级,否则每一个$i$级区域都要被分成至少两个$i+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$。

【动态规划】cf1034C. Region Separation的更多相关文章

  1. Codeforces Round #511 (Div. 1) C. Region Separation(dp + 数论)

    题意 一棵 \(n\) 个点的树,每个点有权值 \(a_i\) .你想砍树. 你可以砍任意次,每次你选择一些边断开,需要满足砍完后每个连通块的权值和是相等的.求有多少种砍树方案. \(n \le 10 ...

  2. 2018.9.21 Codeforces Round #511(Div.2)

    只写了AB,甚至还WA了一次A题,暴露了蒟蒻的本质=.= 感觉考的时候有好多正确或和正解有关的思路,但是就想不出具体的解法或者想的不够深(长)(怕不是过于鶸) 话说CF的E题怎么都这么清奇=.= A. ...

  3. [CF]Round511

    这场比赛我及时的参加了,但是打的时候状态实在是太烂了,只做出来了Div2的AB题. A Little C loves 3 I 直接构造就行. B Cover Points 应该很容易就看出来这个等腰三 ...

  4. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  5. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  6. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  7. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  8. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  9. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

随机推荐

  1. 通过进入单用户模式解决linux中的rc.local修改后无法启动的问题

    问题:本想将teamviewer这个软件随linux自启动,所以将其启动命令放在rc.local中,但是重启后发现linux启动不起来了,系统前面都是正常启动的,就是无法进入帐户登陆界面,无法输入ro ...

  2. (初学)wpf仿QQ界面-整体布局

    跟一个小学弟一起学习wpf,小学弟是刚初中毕业,对编程刚刚接触,我挺怕自己带的不好,影响小学弟以后在编程方向的学习兴趣.我承认自己水平不高,但是在努力去学习新知识!一起加油吧!在此以博客,记录学习进度 ...

  3. wpf 查找父元素、子元素方法

    1 /// <summary> 2 /// 根据类型查找子元素 3 /// </summary> 4 /// <typeparam name="T"& ...

  4. JS获取前一个页面

    document.referrer 可以得到上一个点击超连接进来的页面URL注意:只能访问服务器上页面使用,打开本地文件无效(为空字符串)

  5. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  6. css颜色 hsla 和line-gradient

    h 表示色调 从0-360 s 饱和度  0 - 100% l 亮度    0 -100% a 透明度  0-1

  7. jquery的全选和多选操作

    //全选产品 $('#checkAll').click(function() { $(this).prop('checked',!$(this).prop('checked')); if($(this ...

  8. mvc中尽量避免使用HttpContext.Current.Request

    在Mvc开发中滥用HttpContext.Current.Request,可能会造成非IE浏览器重复加载页面的情况. 不管你信不,反正我在Mvc3.0中遇到过.

  9. JavaScript 获取数组的最大值和最小值

    js获取数组最大值和最小值 使用apply方法: var a = [1,2,3,5]; console.log(Math.max.apply(null, a));//最大值 console.log(M ...

  10. C#中生成随机数的几种方法

    Random 类 Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数 Random rd = new Random() rd.next(,)(生成1~1 ...