zoukankan      html  css  js  c++  java
  • 省选模拟32 题解

    A. 送你一道签到题

    这个函数显然是个积性函数。

    刚开始的想法是可以直接考虑分开每个质因子,然后乘一块的贡献显然是正确的。

    后来一想这个玩意实际上就是 $id^k$ 点积上 $d(x)$ 的 $m$ 次卷积,所以肯定是积性的。 

    然后看这个数据范围,显然要搞个 min25筛。

    然后一想,这个玩意,质数处取值简单,$p^k$ 处的取值只与 $k$ 有关,可以直接通过 dp 预处理。

    然后这个玩意就完美符合 min25筛 的要求,所以直接整上去就完事了。

    B. 神犇

    凭借原来的经验,我们可以把区间内出现次数相同转化为差分后前缀和相同。

    然后对每种前缀和开一棵 01trie 树,直接容斥算 size 大小就解决了。

    当内存开到 512MB 的时候,上述做法是能过通过的。

    如果内存压到 256MB ,就需要一些优秀的压内存技巧。

    容易发现 01trie 树上的很多点是没有必要的,当只有一条单独的链的时候,可以把这条链的信息直接压在一起考虑。

    然后是一个常用的压儿子的技巧,就是使左右儿子中的一个的编号恰好等于这个点的编号+1。

    size 数组可以直接用 unsigned short 存储,但是会爆,所以在爆的时候用儿子编号数组的最高位存一下爆了几次。

    正解的思想大概是省掉了容斥,通过维护几个多元组,来实现如果存在合法解一定能找到的效果,但是挺恶心的,没懂具体做法。

    C. 开挂

    大概的思想是枚举最终恰好框住所有 $1$ 的最小的矩形,然后考虑计算这样的方案数。

    如果有了这个大矩形,那么用两个 $x*y$ 的矩形的最优策略一定是选择两个对角。

    另外,在这个大矩形内,必须有 $1$ 覆盖每一条边。

    然后可以发现这个玩意就转化为了一个简单的 dp 问题,把以上 $6$ 种信息状压一下,然后直接暴力 dp 就完事了。

    另一种做法是直接容斥,就是通过枚举几条边没有选上来容斥出每条边都选上的方案数。

  • 相关阅读:
    Maganto错误Cannot initialize the indexer process的解决方法
    保护单元格内容
    欧几里得算法
    SVN服务端命令行的使用心得
    C++常用数值类型的值范围的宏定义
    代码之谜(三) 运算符
    《越狱》观后感
    R 报错的问题
    代码之谜(二) 语句与表达式
    你为什么薪水那么低(二)之 生产力
  • 原文地址:https://www.cnblogs.com/skyh/p/12369083.html
Copyright © 2011-2022 走看看