zoukankan      html  css  js  c++  java
  • 模拟57 题解

    A. 天空龙

    一个很好的性质是:最优方案可以不存在一个颜色A,转化为B再转化为C。

    因为将A直接转化为C一定更优。

    所以无需分类讨论,直接用一个sum判断正负就可以了。

    B. 巨神兵

    有向图无环,所以存在拓扑序,所以用分层图dp。

    设f(i,j)表示已经考虑点集i,并且点集j在分层图的最后一层。

    显然j是i的子集,转移到的状态又是i的超集。

    枚举i的超集作为分层图的下一层,推一推转移系数就可以了。

    用枚举子集的方法,总复杂度为$O(4^nm)$。

    正解成功压掉了j一维,并用新增点的奇偶性对应1和-1作容斥系数,直接进行dp。

    原因大概是,每一个分层图的不同层,被划分为了从不同的集合转移而来。

    C. 太阳神

    发现问题的正向比较复杂,于是考虑逆问题。

    $sum limits_{a=1}^{n} sum limits_{b=1}^{n}[lcm(a,b)<=n]$

    $=sum limits_{d=1}^{n} sum limits_{a=1}^{n} sum limits_{b=1}^{n}[frac{ab}{d}<=n][gcd(a,b)==d]$

    $=sum limits_{d=1}^{n} sum limits_{a=1}^{n/d} sum limits_{b=1}^{n/d}[ab<=n/d][gcd(a,b)==1]$

    设$f(n)=sum limits_{i=1}^{n} sum limits_{j=1}^{n}[i*j<=n][gcd(i,j)==1]$
    原式$=sum limits_{d=1}^{n} f(n/d)$

    设$sum(n)=sum limits_{i=1}^n sum limits_{j=1}^n [i*j<=n]$
    显然$sum(n)$可以用整除分块$O(sqrt n)$求出。

    那么$f(n)=sum(n)-sum limits_{i=2}^{sqrt n} f(frac{n}{i^2})$
    即枚举不合法的$gcd$为什么,继续递归进行。

    为了保证复杂度为$O(n^{frac{2}{3}})$而不是$O(n^{frac{3}{4}})$,还需要写一个线性筛出$n^{frac{2}{3}}$以内的函数值。

    不妨只考虑增量$f(i)-f(i-1)$也就是$sum limits_{i=1}^{n} sum limits_{j=1}^{n}[lcm(i,j)==n]$

    设$n$有$k$个质因子,那么$f(i)-f(i-1)=2^k$,所以筛质因子个数。

    在主函数中整除分块统计答案$f$即可。

  • 相关阅读:
    LintCode "Maximum Gap"
    LintCode "Wood Cut"
    LintCode "Expression Evaluation"
    LintCode "Find Peak Element II"
    LintCode "Remove Node in Binary Search Tree"
    LintCode "Delete Digits"
    LintCode "Binary Representation"
    LeetCode "Game of Life"
    LintCode "Coins in a Line"
    LintCode "Word Break"
  • 原文地址:https://www.cnblogs.com/skyh/p/11620712.html
Copyright © 2011-2022 走看看