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$即可。

  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/skyh/p/11620712.html
Copyright © 2011-2022 走看看