省选模拟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 就完事了。

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

猜你喜欢

转载自www.cnblogs.com/skyh/p/12369083.html