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

    A. 字符交换

    枚举最终出现的字符,那么答案具有单调性。

    之后枚举相同字符的起点,可以计算出终点。

    最优策略显然是换到中间的字符旁边,所以用前缀和维护一下就完了。

    B. 平方数

    考虑怎样的两个数相乘可以构成平方数:

    将两个数分别质因数分解,如果二者奇数的质因子集合相同,那么可以构成。

    所以可以用哈希表压奇数质因子集合。

    然而比较难处理的是质因数分解,暴力根号筛会$TLE$。

    这时可以考虑利用本题的特殊性质,即只需要筛出平方质因子,剩下的自然是奇数质因子集合。

    一个$O(a_i^{frac{1}{3}})$的筛法是,

    枚举质数直到$a_i^{frac{1}{3}}$大小,将平方因子直接除掉,将剩余的奇数质因子提出。

    最后特判筛后剩余的结果,如果是平方数,那么将它除掉。

    提出的质因子乘最终筛剩余的数,即要求的奇数质因子集合。

    可以证明上述的筛法是正确的:

    设最后筛剩下的数为$x$,如果仍然含有平方质因子,那么

    $x$一定可以表示为$x=k*p^2$ $(p>x^{frac{1}{3}})$。

    那么$k<x^{frac{1}{3}}$,所以$k$只能为$1$,

    因为特判了最终的$x$为平方数,正确性得证。

    C. 多维网络

    直接用排列组合,可以得出在没有坏点的情况下,两点之间的路径数。

    所以考虑用奇加偶减的容斥处理这个问题。

    显然坏点之间存在一个拓扑序,即按维排序。

    设$dp_{i,j}$表示到第$i$个坏点,总共经过了$j$个坏点的方案数。

    可以进行显然的$dp$转移,然而这样做的复杂度是$O(n^3d)$。

    实际上第二维并没有用,因为只关注奇偶性来进行容斥操作,所以直接压掉第二维就好了。

  • 相关阅读:
    2014华为上机题(转)
    c语言scanf详解
    Linux环境下Android JNI程序的编译
    C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    容器化交付流程设计
    阿里云云计算相关术语概念
    k8s的部署策略
    pod控制器介绍
    Statefulset详细解析
    k8s持久化状态存储原理
  • 原文地址:https://www.cnblogs.com/skyh/p/11828816.html
Copyright © 2011-2022 走看看