【题解】Solution Set - NOIP2024集训Day32 数位 dp

【题解】Solution Set - NOIP2024集训Day32 数位 dp

https://www.becoder.com.cn/contest/5537

order:1,3,5,6,2,4


「SDOI2013」淘金

就是要算前 k 大的和。

考虑一个位置 (i,j) 在变化完了之后的金子个数。(也即逆变换。

设:f(x) 表示在 1N 范围内,数位积为 x 的个数。

所以这个个数就是 f(i)f(j)

考虑用数位 dp,根号分治转移,算这个 f(x),应该可以做到 O(12912)


16:30 passed...

(主要是很不确定上面这个东西的正确性,然后去参考了一下题解,发现似乎没有我这种做法。😅

其实这个题最核心的地方,就是要缩减 dp 的状态数,上面是根号分治,下面是其他两个主流做法:

  1. 利用每个元素范围都是 19,所以最终成绩一定可以表示为:2a3b5c7d

    这样状态数就是 O(log2Nlog3Nlog5Nlog7N)244,411 的了。

  2. 在一个较大范围内,不同的 f(x) 的个数实际上是不多的。

    1x1012,个数为 8282

    所以我们考虑把这 8282 个先跑出来,然后在这 8282 个之间转移就行了。

    (主打的就是一个神奇结论。


嘶,我傻了。我那个根号分治只适用于算小于等于 x 的。

而且状态是离散的,所以也没办法算用差分算出恰好等于的个数。

emmm,所以假了。


然后我们现在是要求乘积的前 k 大。

直接拉取出来是 912 的级别的,显然不行。

我们对于每一个 i,肯定是从大到小去匹配,指针的移动是具有单调性的,拿一个大根堆动态维护就行了。



「CF55D」Beautiful numbers

一定有 1y9

我们 29 去枚举 x 中非 0 数有哪些。这样总的模数也就确定了,并且这个模数不会超过 9×8×7×52520

直接定义:fi,ji 位,和对当前枚举的模数取模余数为 j 的个数。

然后就没了。

(eh? 6min 速切 *2500?而且还打了这么打一串文字?

posted @   CloudWings  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示